C语言结构体指针数组创建与使用报错求助
排查你的C语言结构体指针数组代码问题并修正
我来帮你一步步揪出这段代码里的问题,顺便教你正确使用结构体指针数组的姿势~
代码里的核心问题清单
- 未声明变量
n:你用了scanf("%d", &n);但完全没定义n,编译器直接会报错,得先加上int n;声明。 malloc放错位置:你把内存分配放在了循环里面,每次循环都会重新分配一块新内存,不仅之前的内存会泄漏(没机会释放),还会把之前存储的数据全覆盖掉。应该在循环开始前就分配好整个结构体数组的空间。- 未初始化的
j:直接用v[j]->a但j从来没赋值,这会导致访问随机内存地址,触发未定义行为(程序崩溃或者乱码都有可能)。你需要用j来记录当前要插入的元素下标,比如初始化为0,每次添加元素后自增。 - 结构体成员访问错误:
v是line*类型(指向结构体数组的指针),v[j]等价于*(v+j),是一个实实在在的line结构体对象,不是指针!所以访问成员应该用.而不是->,->是给指向结构体的指针用的。 scanf读取字符的坑:读取完n之后,输入缓冲区里会留下一个换行符,接下来的scanf("%c", &a);会直接读这个换行符,而不是你输入的+。解决方法是在%c前面加个空格:scanf(" %c", &a);,这样会自动跳过所有空白字符(换行、空格、制表符)。- 内存泄漏隐患:分配的内存最后没有释放,虽然程序结束后系统会回收,但养成好习惯的话,最后要调用
free(v);释放内存。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> typedef struct line { int a; int b; } line; int main() { line *v; int n, c, d, j = 0; // 初始化j为0,声明n char a; int i; // 先读取数组大小 scanf("%d", &n); // 提前分配好整个结构体数组的内存 v = (line*) malloc(n * sizeof(line)); // 检查malloc是否成功(好习惯) if (v == NULL) { printf("内存分配失败!\n"); return 1; } for (i = 0; i < n; i++) { // 加空格跳过空白字符,避免读换行 scanf(" %c", &a); if (a == '+') { // 用.访问结构体成员,因为v[j]是结构体对象 scanf("%d %d", &v[j].a, &v[j].b); j++; // 每次添加后下标自增,准备下一个元素 } // 这里可以处理其他字符的逻辑,比如'-'之类的 } // 测试:打印存储的结构体数据 printf("存储的结构体数据:\n"); for (i = 0; i < j; i++) { printf("第%d个元素:a=%d, b=%d\n", i+1, v[i].a, v[i].b); } // 释放内存,避免泄漏 free(v); return 0; }
额外说明
- 如果你的需求是动态添加元素(而不是一开始就知道n的大小),那应该用动态扩容的方式,比如一开始分配小空间,满了之后用
realloc扩容,不过从你的代码来看,应该是预先知道n的大小,所以上面的写法就足够了。 - 永远要检查
malloc的返回值,如果内存分配失败会返回NULL,不检查的话后续访问会崩溃。
内容的提问来源于stack exchange,提问作者Bobo Lemnaru
相关产品推荐
相关产品推荐

