将字符串分配给 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。