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
相关产品推荐
相关产品推荐

