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

C语言程序偶发"project has triggered a breakpoint"异常求解决方案

问题根因
  • 核心错误是realloc函数的使用方式不符合规范:realloc执行时如果无法在原内存地址上完成扩容,会申请新的内存块、拷贝原有数据后释放原内存块,返回新内存块的地址。你的代码直接调用realloc(str, 新大小)却没有接收返回值,导致后续操作的str可能是已经被释放的野指针,访问野指针属于未定义行为,所以会出现偶发崩溃的情况。
  • 补充风险点:如果realloc申请内存失败会返回NULL,直接将返回值赋值给原指针会导致原有内存地址丢失,造成内存泄漏,建议先用临时指针接收返回值做合法性校验后再赋值给原指针。
修复方案

把原代码里的

realloc(str, sizeof(char)*1 + strlen(str) + 1);

替换为:

// i为当前已存储的字符数,+1存新字符+1存结束符
char *temp = realloc(str, i + 2);
if (temp == NULL) {
    // 内存申请失败,释放原有内存后退出
    free(str);
    return 1;
}
str = temp;
修正后完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char* str;
    char character;
    int i = 0;

    // 初始存1个字符+1个结束符,sizeof(char)恒为1可省略
    str = (char*)malloc(2);
    if (str == NULL) return 1;

    printf("Please enter a character: ");
    scanf_s(" %c", &character);

    while (character != 'X')
    {
        str[i] = character;
        i++;
        str[i] = '\0';
        // 扩容逻辑修正
        char *temp = realloc(str, i + 2);
        if (temp == NULL) {
            free(str);
            return 1;
        }
        str = temp;
        printf("Please enter a character: ");
        scanf_s(" %c", &character);
    }
    str[i] = '\0';
    
    printf("%d\n", strlen(str));
    puts(str);

    free(str);
    return 0;
}

内容的提问来源于stack exchange,提问作者Modern

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:54:02