将字符串分配给 C 中的结构变量时出现分段错误
segmentation fault while assigning string to a struct variable in C
我目前正在学习 C 语言的结构并且正在为字符串赋值而苦苦挣扎。
如果我这样写代码,我会遇到分段错误:
#include<stdio.h>
int main(void)
{
struct part {
char *name;
};
struct part part_1[2];
fgets(part_1[0].name,20,stdin);
printf("%s\n",part_1[0].name);
}
我尝试了其他一些方法,一切正常,所以我没有发现上面的代码有什么问题。
例如:如果我将 fgets(part_1[0].name,20,stdin)
更改为 part_1[0].name = "some_dummy_data_here"
,我不会出错。
最令人困惑的是,如果我使用 fgets(part_1[1].name,20,stdin)
而不是 fgets(part_1[0].name,20,stdin)
,它就可以工作。
但是,如果我使用数组而不是指针,我就没有问题。例如,如果我这样写代码:
struct part{
char name[20];
}
一切顺利。
那么,这里的问题是什么?
char * name 和char name [20]的区别在于,后者在定义的时候,编译器已经为它分配了内存space。如果要使用指针,需要提前为它们分配内存。例如使用malloc函数:
part_1[0].name = malloc(sizeof(char)*20)
然后 fgets 将不会生成段错误。
至于代码part_1[0].name = "some_dummy_data_here",字符串"some_dummy_data_here"是一个字符串常量,已经在内存中了。此代码让指针名称指向它,因此无需提前分配 space。
我目前正在学习 C 语言的结构并且正在为字符串赋值而苦苦挣扎。
如果我这样写代码,我会遇到分段错误:
#include<stdio.h>
int main(void)
{
struct part {
char *name;
};
struct part part_1[2];
fgets(part_1[0].name,20,stdin);
printf("%s\n",part_1[0].name);
}
我尝试了其他一些方法,一切正常,所以我没有发现上面的代码有什么问题。
例如:如果我将 fgets(part_1[0].name,20,stdin)
更改为 part_1[0].name = "some_dummy_data_here"
,我不会出错。
最令人困惑的是,如果我使用 fgets(part_1[1].name,20,stdin)
而不是 fgets(part_1[0].name,20,stdin)
,它就可以工作。
但是,如果我使用数组而不是指针,我就没有问题。例如,如果我这样写代码:
struct part{
char name[20];
}
一切顺利。
那么,这里的问题是什么?
char * name 和char name [20]的区别在于,后者在定义的时候,编译器已经为它分配了内存space。如果要使用指针,需要提前为它们分配内存。例如使用malloc函数:
part_1[0].name = malloc(sizeof(char)*20)
然后 fgets 将不会生成段错误。
至于代码part_1[0].name = "some_dummy_data_here",字符串"some_dummy_data_here"是一个字符串常量,已经在内存中了。此代码让指针名称指向它,因此无需提前分配 space。