结构体数组中char*指针赋值引发段错误的问题求助
问题根源
你的结构体中name是未初始化的char*指针,它指向随机的内存地址。直接用scanf往这个地址写入数据属于非法内存访问,第一次循环没触发错误只是巧合,第二次触发段错误是必然结果。
解决方法
有两种常用的修复方式,根据需求选择:
方法1:用固定大小字符数组替代指针
修改结构体定义,把char* name换成足够大的字符数组,结构体初始化时会自动分配内存:
struct products{ int id; char name[100]; // 根据实际需求调整数组大小,比如100字节 int buy; int sell; int q; };
之后直接使用scanf即可,但要限制输入长度避免缓冲区溢出:
scanf("%99s", arr[i].name); // %99s 确保最多写入99个字符,留1个位置给结束符'\0'
方法2:动态分配内存(保持char*指针)
如果需要灵活的内存大小,在读取输入前手动给name分配内存,用完后记得释放:
#include <stdio.h> #include <stdlib.h> struct products{ int id; char* name; int buy; int sell; int q; }; int main(){ struct products arr[5]; for(int i=0; i<5; i++){ // 分配100字节内存,可根据需求调整 arr[i].name = malloc(100 * sizeof(char)); if(arr[i].name == NULL){ perror("malloc failed"); // 打印内存分配失败原因 return 1; } scanf("%99s", arr[i].name); // 限制输入长度 } // 业务逻辑处理... // 释放内存,避免内存泄漏 for(int i=0; i<5; i++){ free(arr[i].name); } return 0; }
注意:必须检查malloc的返回值,防止内存分配失败;使用完内存后一定要调用free释放,否则会造成内存泄漏。
内容的提问来源于stack exchange,提问作者Tsji
相关产品推荐
相关产品推荐

