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

C语言调用含结构体指针的函数时for循环意外中断问题求助

问题根因排查
  • 核心问题是栈的存储数组未分配合法内存:你定义的struct stack中的arr是字符型指针,仅完成了声明,没有根据输入的栈大小申请对应的内存空间,属于野指针。在push函数中执行ptr->arr[(ptr->top)] = x;操作时,是向随机非法内存地址写入数据,触发C语言未定义行为,可能意外篡改栈上的i、size等变量的值,最终导致for循环提前终止、程序崩溃等异常表现。
  • 次要问题:printf("test iteration ");没有加换行符,输出缓冲区未及时刷新,可能出现输出内容延迟显示的情况,容易误导你判断循环执行次数。
修复方案
  1. 在读入栈大小n之后,为arr申请对应长度的堆内存
  2. 增加内存分配失败的异常判断逻辑
  3. 程序退出前释放申请的内存,避免内存泄漏
修复后的完整代码
#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:45:03