2012-06-07 50 views
-2

我一直在檢查Google一個小時。我曾嘗試使用typdef,但我得到了相同的結果。我在結構範圍方面有點混亂。我確信這只是我失蹤的一件愚蠢的事情。C - 在多種功能中使用結構

例,打印0:

#include <stdio.h> 
struct info 
{ 
    int i; 
}; 
struct info testinfo; 

int test() 
{ 

    testinfo.i = 5; 
} 

int main() 
{ 
    printf("%d", testinfo.i); 
} 
+3

什麼是你的實際問題? –

+2

這是什麼問題?你的榜樣也沒有意義。你永遠不會調用函數測試,並嘗試打印未初始化的字符串。 –

+2

-1:沒有真正的問題。示例代碼沒有顯示任何內容 – eyalm

回答

7

兩個結構信息有塊範圍,因爲你聲明爲局部變量。 因此它們是不同的對象。 僅在文件範圍聲明一個(在任何函數之外)。

(有問題的代碼已被編輯,本答案指的是最初的錯誤)。

+0

WOWOW我不知道這是他想要做的,直到我讀到你的答案。 –

2

你要麼需要變量testinfo傳遞給函數test()或有test()返回info結構

這是第一個選項:

int test(struct info * ti) { 
    ti->buf = "test"; 
} 
int main() { 
    struct info testinfo; 
    test(&testinfo); 
    printf("%s", testinfo.buf); 
} 

:在*表示指針到結構,否則你會複製結構,任何修改將只出現在副本中(所以main的版本不會改變)

0

當你

printf("%s", testinfo.buf); 

testinfo.buf未分配!嘗試

struct info testinfo; 
testinfo.buf = (char *) malloc(123); 

<編輯>

strcpy(testinfo.buf, "hello world!"); 

</EDIT >

printf("%s", testinfo.buf); 

獲得分配完畢。

+0

您還需要將一些以空字符結束的字符串放入分配的內存中才能使用。 –

3

這與結構無關 - 您會看到與任何類型相同的行爲。發生了什麼是每個testinfo是在一個不同的範圍和命名空間。

此外,你永遠不會打電話給你的功能。

你可以要麼使testinfo全球性的,或者你可以通過指針,它是一個更好的主意傳遞:

#include <stdio.h> 

struct info 
{ 
    char* buf; 
}; 

int test(struct info* testinfo) 
{ 
    testinfo->buf = "test"; // it's a bad idea to have a char* to a literal 
          // you should probably allocate new storage 
} 

int main() 
{ 
    struct info testinfo; 
    test(&testinfo); 
    printf("%s", testinfo.buf); 
} 
0

你不能做一個

testinfo.buf = "test" 
  1. 您必須分配字符串的空間,buf只是一個字符指針。

struct info { char buf[10]; /*10 is the space for buf*/ };

你也應該指定字符串時使用strcpy(dest,source)。 而且你不打電話測試。 將這兩樣東西排序出來,你會得到輸出。

+0

@SleepingDragon - 'testinfo.buf =「test」'是有效的。 –

+0

@Ed Heal但不建議,strcpy是一個更好的方法。我沒有說「你必須」,我說「你應該」。 :) –

+0

@SleepingDragon - 其實你說(我從上面引用)'你不能做'。你能行的。這取決於你打算用絃樂打好什麼。這是完全有效的。 –

0

約翰,與更新的問題,你需要撥打testprintf

int main() 
{ 
    test(); 
    printf("%d", testinfo.i); 
    return(0); 
}