C语言中使用strcpy触发Access violation问题求助
问题分析:strcat触发访问违例错误
你编写的C语言代码在执行strcat(lineBuffer, ',')时触发Access violation错误,错误提示:
Exception thrown at 0x00007FFCB7B5D1CB (ucrtbased.dll) in PA_2.exe: 0xC0000005: Access violation reading location 0x000000000000002C.
你疑惑lineBuffer是栈上数组(非只读内存),为何无法修改。
出错代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE_OF_RECORD 100 void main() { char lineBuffer[SIZE_OF_RECORD]; memset(lineBuffer, '\0', (SIZE_OF_RECORD - 1) * sizeof(char)); strcpy(lineBuffer, "testing"); strcat(lineBuffer, ','); // 异常触发位置 printf("line buffer after assemble line \n%s", lineBuffer); }
错误原因
strcat的函数要求第二个参数是指向以'\0'结尾的字符串的指针,但你传入的是单个字符','。- 字符
','的ASCII值是44(十六进制0x2C),程序会把这个值当作内存地址去访问,0x000000000000002C是无效内存,因此触发访问违例。 lineBuffer本身是栈上的可写内存,问题并非它不能被修改,而是strcat的参数错误导致了非法内存读取。
解决方案
有两种常见修复方式:
- 将单个字符改为字符串形式,用双引号包裹:
strcat(lineBuffer, ","); - 直接定位到字符串末尾手动添加字符(更高效,无需调用strcat):
strcpy(lineBuffer, "testing"); // 找到字符串末尾指针 char* end = lineBuffer + strlen(lineBuffer); // 确保缓冲区还有剩余空间(留一个位置给结束符) if (end < lineBuffer + SIZE_OF_RECORD - 1) { *end = ','; *(end + 1) = '\0'; // 手动补充字符串结束符 }
内容的提问来源于stack exchange,提问作者Jacob Smith
相关产品推荐
相关产品推荐

