数组操作引发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
相关产品推荐
相关产品推荐

