我试图创建一个函数来为结构成员分配一个值。
#include <stdio.h>
#include <string.h>
typedef struct
{
int id;
char *data;
}person_t;
person_t person_build(int id, char *data);
int main (int argc, char *argv[])
{
person_t person = person_build(atoi(argv[1]), argv[2]);
return 0;
}
person_t person_build(int id, char *data)
{
person_t person;
person.id = id;
strcpy(person.data, data);
return person;
}
该程序编译成功。
我运行该程序并将命令行参数作为参数
以person_build()
作为参数。
>struct5.exe 4 Something
操作系统(Windows 7)给我一个警告this program has stopped working
但是在没有任何命令行参数的情况下运行(更改命令行参数以外的person_build()
参数)该程序可以运行。
有人可以解释为什么会发生这种行为吗?
答案 0 :(得分:0)
您的程序无法正常工作,因为您正在访问尚未初始化的内存结构。具体做法是:
typedef struct
{
int id;
char *data;
}person_t;
这会创建一个char *
作为成员的结构。 char *
不分配任何实际内存,它只是在结构中保留一个成员,该成员可以保存应该指向值的内存地址。后来,你:
strcpy(person.data, data);
您现在正在将数据复制到person.data
指向的内存位置,即使您从未分配过内存或已初始化person.data
。
你可以采取这种方法:
person_t person_build(int id, char *data)
{
person_t person;
person.id = id;
person.data = malloc(sizeof(char) * strlen(data) + 1);
if(person.data != NULL) strcpy(person.data, data);
return person;
}
这会分配适当大小的内存,在字符串末尾计算空终止,验证分配是否成功,然后才会尝试复制到该内存。
这远未完成。我想你可能还有很多障碍需要克服!