You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结构体数组中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:57:17