C结构错误:检测到堆栈碎片,中止(核心转储)

时间:2016-01-31 21:51:52

标签: c struct coredump

您好我正在使用“struct”编写一个简单的C程序。我试图添加字符串(这似乎总是麻烦),我终于得到编译,但当我运行它时,我得到一个错误。文件名是“struct”,这是错误:

*** 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;
}

我不知道它为什么编译好然后崩溃。我猜这是与字符串相关的代码的内存问题。有趣的是它实际上工作并将信息打印到控制台然后它崩溃。任何帮助表示赞赏。感谢。

3 个答案:

答案 0 :(得分:0)

试试这个。你没有为名字分配内存。

struct members {

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

答案 1 :(得分:0)

您没有为name的{​​{1}}元素分配内存。在执行struct members时,您将在堆栈内存中写入strcpy,并且#34;粉碎&#34;堆栈。

您需要通过声明

来静态地为person元素分配内存
name

或更好,使用

动态char name[20];
main()

答案 2 :(得分:0)

问题是结构或其他地方没有空间来保存字符串“Mathew”的字符。

关于这一行:

char name[];

建议改为:

char *name;

然后,因为没有分配数据的实际字节,只有一个指针,通过指针设置它。即。

person.name = strdup( "Mathew" );

当然记得,在退出main()之前将指针传递给free()

free( person.name );

第二,(但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");