2016-01-31 49 views
0

嗨我正在使用「結構」編寫一個簡單的C程序。我試圖添加字符串(這似乎總是麻煩),我終於可以編譯,但是當我運行它時,我得到一個錯誤。該文件的名稱是「結構」,這是錯誤:C結構錯誤:檢測到堆棧粉碎,中止(核心轉儲)

*** stack smashing detected *** ./struct terminated 
Aborted (core dumped) 

下面是代碼:

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


struct members { 

    int id; 
    int age; 
    char name[]; 
}; 
int main(void) 
{ 
    struct members person; 
    person.id = 1223; 
    person.age = 37; 
    strcpy(person.name, "Matthew"); 

    printf("ID: %d\n Age: %d\n Name: %s\n", person.id, person.age, person.name); 

return 0; 
} 

我不知道爲什麼它編譯罰款,然後崩潰。我猜這是代碼與字符串有關的內存問題。有趣的是,它實際上工作,並打印信息到控制檯,然後崩潰。任何幫助表示讚賞。謝謝。

+0

因爲'char name []'就像做'const char *'你應該直接給它賦值就像'person.name =「Matthew」' –

+2

「編譯正確」並不意味着程序**是**正確。如果你設法編寫一個可以確保這一點的工具,你解決了_halting問題_並且是圖靈獎的最佳人選。 – Olaf

+0

http://stackoverflow.com/q/12680946/3185968 – EOF

回答

0

試試這個。你沒有爲名稱分配內存。

struct members { 

    int id; 
    int age; 
    char * name; 
}; 
... 
person.name=strdup("Matthew"); 
+0

也感謝您的回覆 – DGwang

0

你沒有分配給struct membersname元素記憶。在執行strcpy時,您將在堆棧內存寫入person的位置,以「粉碎」堆棧。

你需要,無論是靜態使用

persons.name = calloc(1, strlen("Matthew") + 1); 
+0

這是非常有用的信息。謝謝一堆。 – DGwang

0

問題宣佈它

char name[20]; 
main()

或更好的,動態分配內存的name元素在結構沒有空間,也沒有其他地方,以保持字符串「Mathew」的字符。

關於這條線:

char name[]; 

建議改變爲:

char *name; 

然後,由於沒有用於實際字節數據中,只有一個指針,經由設置它沒有分配指針。 I.E.

person.name = strdup("Mathew"); 

當然記得,在離開主()到該指針傳遞給free()

free(person.name); 

第二,前(BUT IMO:不太理想的技術,因爲不知道所需的最大長度)可以改變該結構定義:

struct members 
{ 
int id; 
int age; 
char name[100]; // arbitrary size, but must be large enough to hold max name string, including NUL termination byte 
}; 

那麼當前的代碼將工作:

strcpy(person.name, "Matthew"); 
+0

感謝您的有益幫助。 – DGwang