输入值过大时C程序触发访问违例(0xC0000005)错误求助
问题分析与修复方案
核心问题定位
你的程序崩溃的主要原因有两个,同时还有其他潜在问题:
- 未初始化变量
j:j在第一次使用前没有赋值,初始值是随机垃圾值,会导致访问alphabet数组时可能越界,触发未定义行为。 - 非法移动指针导致内存越界:循环中的
letters+=i;是致命错误。malloc返回的指针指向分配内存的起始地址,每次循环移动指针后,letters[i]的访问会越来越偏离原本的内存区域,很快就会超出分配的内存范围,直接触发访问违例(0xC0000005)。而且最后free时,指针已经不是malloc返回的原始指针,这属于未定义行为,会导致内存泄漏或崩溃。 - 提前return时的指针错误:当
i>399提前返回时,letters已经被多次移动,此时free的不是原始指针,同样会引发问题。 - 缺少
malloc失败检查:malloc可能因内存不足返回NULL,直接使用会导致崩溃。
修复后的代码
#include <stdio.h> #include <stdlib.h> int main() { char *letters; int memory_request, i, j = 0; // 初始化j为0,从字母表首字符开始 char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; printf("How many letters are you going to want? "); scanf("%d", &memory_request); // 限制最大打印400个字符,符合需求 if (memory_request > 400) { memory_request = 400; } // 检查内存分配是否成功 letters = malloc(sizeof(char) * memory_request); if (letters == NULL) { printf("Memory allocation failed!\n"); return 1; } for (i = 0; i < memory_request; i++) { letters[i] = alphabet[j]; j++; if (j > 25) { j = 0; } // 每40个字符换行,避免开头空行 if ((i + 1) % 40 == 0) { printf("\n"); } printf("%c", letters[i]); } free(letters); // 使用原始指针释放内存 printf("\n"); return 0; }
修复说明
- 初始化
j为0,确保从字母表第一个字符开始循环。 - 删除
letters+=i;,保持指针指向分配内存的起始地址,确保letters[i]的访问始终在合法范围内。 - 提前限制
memory_request不超过400,符合“最多打印400个字符”的需求,避免不必要的内存分配。 - 添加
malloc失败检查,增强程序健壮性。 - 调整换行条件为
(i+1)%40==0,避免第一个字符前出现空行,优化打印格式。 - 确保
free的是malloc返回的原始指针,避免未定义行为。
内容的提问来源于stack exchange,提问作者ziggaboogi
相关产品推荐
相关产品推荐

