C程序执行printf后崩溃返回0xC0000005错误求助
解决程序0xC0000005访问违规错误的方案
你的程序返回0xC0000005错误是因为存在两处严重的内存访问问题,下面逐一说明并给出修复方案:
问题1:未初始化指针+错误的scanf用法
ibanPessoal和passwordPessoal是未初始化的char指针,没有指向任何有效内存区域;同时scanf("%s", &ibanPessoal);的写法完全错误——%s需要传入char*类型的参数,你传的是指针的地址(char**),输入时会直接破坏内存空间,触发访问违规。
问题2:修改只读字符串字面量
char* pastaDoUsuario = "nil";中,"nil"是存储在程序只读数据段的字符串字面量,不允许被修改。你用sprintf往里面写入新内容,直接触发了只读内存的写入保护错误。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> // 包含Sleep和_access所需的头文件 // 定义输入内容的最大长度,防止缓冲区溢出 #define MAX_IBAN_LEN 30 #define MAX_PWD_LEN 20 #define MAX_FOLDER_PATH 50 const char* nomePastaContas = "contas"; // 用固定大小的字符数组替代未初始化的指针,确保有可用内存 char ibanPessoal[MAX_IBAN_LEN]; char passwordPessoal[MAX_PWD_LEN]; void loginMenu(){ system("cls"); printf("\n\n IBAN: "); // 限制输入长度,避免超出数组范围 scanf("%29s", ibanPessoal); printf("\n\n Password: "); scanf("%19s", passwordPessoal); printf("Debug\n"); verificarConta(ibanPessoal, passwordPessoal); } void verificarConta(char* iban, char* pswd){ printf("Debug 2\n"); // 用字符数组存储路径,替代只读的字符串字面量 char pastaDoUsuario[MAX_FOLDER_PATH]; strcpy(pastaDoUsuario, "nil"); printf("Debug 3\n"); printf("\n\n IBAN: %s\n PASSWORD: %s\n", iban, pswd); printf("Debug 4\n"); printf("\n\n%s\n", pastaDoUsuario); sprintf(pastaDoUsuario, "contas/%s", iban); printf("\n\n Pasta de Usuario: %s\n", pastaDoUsuario); if(_access(pastaDoUsuario, 0) == 0){ printf("Usuario encontrado\n"); } else{ printf("Usuario nao encontrado.\n"); } Sleep(10000); // 缩短睡眠时间,方便测试 }
关键修复点说明
- 把未初始化的指针替换为固定大小的字符数组,确保有足够内存存储输入内容,同时通过
scanf的长度限制(如%29s)防止缓冲区溢出。 - 将
pastaDoUsuario改为可修改的字符数组,避免写入只读内存区域。 - 给调试
printf添加换行符,避免输出缓冲导致调试信息延迟显示,方便排查问题。
内容的提问来源于stack exchange,提问作者pinx
相关产品推荐
相关产品推荐

