您好我正在使用“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;
}
我不知道它为什么编译好然后崩溃。我猜这是与字符串相关的代码的内存问题。有趣的是它实际上工作并将信息打印到控制台然后它崩溃。任何帮助表示赞赏。感谢。
答案 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");