2014-01-11 170 views
2

以下兩個代碼類似,但第一個代碼具有結構,第二個代碼沒有。*將char轉換爲main並將* char轉換爲struct

爲什麼這段代碼有效(沒有警告)?

#include <stdio.h> 
#include <string.h> 

struct prova 
{ 
    char *stringa; 
}; 

int main() 
{ 
    struct prova p; 

    strcpy (p.stringa, "example\0"); 

    printf("%s\n", p.stringa); 

    return 0; 
} 

但是下面的代碼不起作用?

Segmentation fault (core dumped)

有了這樣的警告:

code.c: In function ‘main’: code.c:8:9: warning: ‘stringa’ is used uninitialized in this function [-Wuninitialized] strcpy (stringa, "example\0");

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char *stringa; 

    strcpy (stringa, "example\0"); 

    printf("%s\n", stringa); 

    return 0; 
} 

謝謝!

+1

你沒有爲'stringa'分配內存。它可能工作與否,但仍然是錯誤的。嘗試在第一個例子中放大一些 – m0skit0

+0

是的,我知道這是錯誤的,但我不明白爲什麼第一個代碼有效! (謝謝你的回答!) –

+0

由於內部關於如何分配內存。第一個例子可能比第二個分配更多的內存,或者以不同的方式分配內存。這是編譯器特定的,可能使用不同的編譯器/平臺會產生不同的結果。 – m0skit0

回答

4

因爲您複製到由未初始化的變量指定的地址,所以都不正確。因此這兩個程序都會調用未定義的行爲。

事實上,其中一個程序的作品是純粹的機會。未定義行爲的一種可能形式是您的程序正確運行。

您需要初始化指針以引用足夠大小的內存塊。例如:

char *stringa = malloc(8); 

注意,你並不需要一個空終止添加一個字符串。這是隱含的。因此,鑑於這種內存分配,你可以接着寫:

strcpy(stringa, "example"); 
+0

好的,非常感謝!但是,這個:'char * stringa = malloc(10 * sizeof(char));'這是一樣的:'char stringa [10];'? –

+2

@user不是。前者分配動態內存,必須通過調用free來避免泄漏。後者自動分配存儲空間,並且字符數組只與包含範圍一樣長。請注意'sizeof(char)'在定義上等於1,所以習慣C忽略它。如果你打算自動分配,你會寫'char stringa [] =「example」;' –

+0

如果事先我不知道我使用malloc的大小,但如果我知道大小是什麼原因選擇例如)'char * stringa = malloc(10);'或'char stringa [10];'? –

1

你需要給字符串一些內存,以便將字符複製到。

使用malloc

除了第一個例子不能編譯。

1

當你寫

結構PROVA { 的char * stringa; };

int main() { struct prova p;

strcpy (p.stringa, "example\0"); 

請注意,p.stringa指向無處不在,但您複製到它。