我目前正在学习C语言中的结构,并在字符串分配方面遇到困难。
如果我这样写代码,我会出现分段错误:
#include<stdio.h>
int main(void)
{
struct part {
char *name;
};
struct part part_1[2];
fgets(part_1[0].name,20,stdin);
printf("%sn",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]的区别在于,当定义后者时,编译器已经为其分配了内存空间。如果你想使用指针,你需要提前为它们分配内存。例如,使用malloc函数:
part_1[0].name=malloc(sizeof(char(*20(
然后fgets就不会产生segmentfault。
至于代码part_1[0]。name="part_1[0]";some_dummy_data_here";,字符串";some_dummy_data_here";是字符串常量,并且已在内存中。这段代码让指针名称指向它,因此不需要预先分配空间。