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

数组操作引发Segmentation Fault,编程新手求助(大学作业)

帮你排查Segmentation Fault的问题

嘿,作为编程新手遇到这种问题太正常了,我来帮你拆解下代码里的问题——这正是触发Segmentation Fault的根源:

核心问题分析

  • 结构体定义逻辑错误:你的struct obat里,harga和stok被定义成了int[10]数组,但实际上每个药品只需要对应单个价格和库存值,数组定义完全没必要,还会增加内存混乱的风险。
  • 结构体变量类型不匹配:你只声明了一个单独的struct obat o变量,但你要存储n个药品的信息,这明显不够用,必须定义结构体数组来存放多个药品的数据。
  • 内存访问越界(致命问题):循环里的scanf("%s", &o.nama[i])是直接导致崩溃的原因!o.nama是长度为10的字符数组,o.nama[i]只是数组里的第i个字符,你把字符串输入到单个字符的地址上,会直接覆盖后续的内存空间,触发Segmentation Fault。

修正后的代码示例

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() { // 标准main函数应该返回int类型
    int i, n;
    // 修正结构体定义:harga和stok改为单个int,符合单药品的属性逻辑
    struct obat {
        char nama[10];
        char kode[10];
        int harga;
        int stok;
    };
    
    // 定义结构体数组,假设最多存50个药品;如果需要更灵活,也可以用动态分配
    struct obat o[50];
    
    printf("Masukan jumlah obat = ");
    scanf("%d", &n);
    
    // 循环输入n个药品的完整信息
    for (i = 0; i < n; i++) {
        printf("Masukan nama obat ke-%d: ", i + 1);
        // 直接用o[i].nama,它本身就是char数组的首地址,不需要加&
        scanf("%s", o[i].nama);
        
        printf("Masukan kode obat ke-%d: ", i + 1);
        scanf("%s", o[i].kode);
        
        printf("Masukan harga obat ke-%d: ", i + 1);
        scanf("%d", &o[i].harga); // 基本类型需要取地址
        
        printf("Masukan stok obat ke-%d: ", i + 1);
        scanf("%d", &o[i].stok);
    }
    
    // 可选:打印输入的信息做验证
    printf("\n=== Daftar Obat yang Anda Masukan ===\n");
    for (i = 0; i < n; i++) {
        printf("Obat ke-%d: Nama=%s | Kode=%s | Harga=%d | Stok=%d\n", 
               i+1, o[i].nama, o[i].kode, o[i].harga, o[i].stok);
    }
    
    return 0;
}

额外小提示

  • 如果药品名称包含空格,scanf("%s")会截断输入,建议改用fgets来读取字符串。
  • 如果不确定n的最大值,最好用动态内存分配(malloc)来创建结构体数组,避免数组大小不够的问题,比如:
struct obat *o = malloc(n * sizeof(struct obat));
// 使用完记得用free(o);释放内存哦

内容的提问来源于stack exchange,提问作者Misael Indra Wijaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:58:32