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

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的参数错误导致了非法内存读取。

解决方案

有两种常见修复方式:

  1. 将单个字符改为字符串形式,用双引号包裹:
    strcat(lineBuffer, ",");
    
  2. 直接定位到字符串末尾手动添加字符(更高效,无需调用strcat):
    strcpy(lineBuffer, "testing");
    // 找到字符串末尾指针
    char* end = lineBuffer + strlen(lineBuffer);
    // 确保缓冲区还有剩余空间(留一个位置给结束符)
    if (end < lineBuffer + SIZE_OF_RECORD - 1) {
        *end = ',';
        *(end + 1) = '\0'; // 手动补充字符串结束符
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:10:33