首页 > 解决方案 > 将字符串分配给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];
}

一切顺利。

那么,这里有什么问题呢?

标签: cstringstructure

解决方案


char * name 和 char name [20] 的区别在于后者在定义时,编译器已经为其分配了内存空间。如果要使用指针,需要提前为它们分配内存。例如使用 malloc 函数:</p>

part_1[0].name = malloc(sizeof(char)*20)

然后 fgets 不会产生段错误。

至于代码part_1[0].name = "some_dummy_data_here",字符串"some_dummy_data_here"是一个字符串常量,已经在内存中了。此代码让指针名称指向它,因此无需提前分配空间。


推荐阅读