2016-01-31 50 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