C语言调用含结构体指针的函数时for循环意外中断问题求助
问题根因排查
- 核心问题是栈的存储数组未分配合法内存:你定义的
struct stack中的arr是字符型指针,仅完成了声明,没有根据输入的栈大小申请对应的内存空间,属于野指针。在push函数中执行ptr->arr[(ptr->top)] = x;操作时,是向随机非法内存地址写入数据,触发C语言未定义行为,可能意外篡改栈上的i、size等变量的值,最终导致for循环提前终止、程序崩溃等异常表现。 - 次要问题:
printf("test iteration ");没有加换行符,输出缓冲区未及时刷新,可能出现输出内容延迟显示的情况,容易误导你判断循环执行次数。
修复方案
- 在读入栈大小
n之后,为arr申请对应长度的堆内存 - 增加内存分配失败的异常判断逻辑
- 程序退出前释放申请的内存,避免内存泄漏
修复后的完整代码
#include<stdio.h> #include<stdlib.h> struct stack { int top; int n; char *arr; }; void push(struct stack *ptr,char x); int main(){ struct stack chs; struct stack *ptr; ptr = &chs; ptr->top=-1; printf("enter the size of stack: "); scanf("%d",&ptr->n); // 新增内存分配逻辑 ptr->arr = (char *)malloc(sizeof(char) * ptr->n); if(ptr->arr == NULL){ printf("内存分配失败\n"); return 1; } int size = ptr->n; for(int i=0 ; i < size ; i++){ printf("test iteration %d\n", i); // 增加换行和序号方便观察 push(ptr,'a'); } // 释放内存 free(ptr->arr); ptr->arr = NULL; return 0; } void push(struct stack *ptr,char x){ if(ptr->top >= (ptr->n-1)){ printf("stack overflow\n"); return; } else{ ptr->top = (ptr->top) + 1; ptr->arr[(ptr->top)] = x; } }
内容的提问来源于stack exchange,提问作者Shivam
相关产品推荐
相关产品推荐

