c - 将字符串分配给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] 的区别在于后者在定义时,编译器已经为其分配了内存空间。如果要使用指针,需要提前为它们分配内存。例如使用 malloc 函数:</p>
part_1[0].name = malloc(sizeof(char)*20)
然后 fgets 不会产生段错误。
至于代码part_1[0].name = "some_dummy_data_here",字符串"some_dummy_data_here"是一个字符串常量,已经在内存中了。此代码让指针名称指向它,因此无需提前分配空间。
推荐阅读
- php - PHP:确定十几个变量中的任何一个是否具有特定值
- javascript - 绑定点击功能不适用于ajax内容刷新
- azure - 天蓝色容器和托管磁盘
- php - PHP OAuth 2.0 授权 API 和 .NET 资源 API
- java - 关于 Jaxrpc jar
- javascript - selectedIndex 不适用于 mat-tab-nav-bar 角度材料选项卡
- dialog - 电子:文件对话框窗口应该集中直到决定
- environment-variables - Why the contents of environ in the /proc file system differs from what extern environ pointed to?
- reactjs - 监视在 componentDidMount 中调用的方法
- azure - Azure Function is calling itself twice on App service plan