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

使用指针反转C字符串时触发写入访问违例错误求助

字符串反转函数触发写入访问违规的原因分析

核心问题是试图修改只读的字符串常量,导致操作系统触发写入访问违规错误,具体分析如下:

错误核心原因

代码里的s = "Testing";是罪魁祸首:

  • "Testing"属于字符串常量,程序运行时会被存储在只读内存区域,操作系统会禁止任何对这块内存的写入操作。
  • 你把这个只读常量的地址赋值给指针s后,后续通过*end和*ptr修改内容的操作,本质是在尝试写入只读内存,直接触发Write access violation错误。

附带的参数传递误区

函数参数char s[STRING_LENGTH]看起来是数组,但在C语言中,数组作为函数参数会被自动转换成指针。你直接给s赋值字符串常量的地址,相当于完全抛弃了原本传入的可写数组(如果有的话),转而指向只读内存,完全偏离了操作可写内存的初衷。

修正方案

要解决问题,必须让指针指向可写的内存区域,两种常见实现方式:

方式1:外部传入可写数组

调用函数时传入一个已初始化的可写字符数组,函数内部直接操作这个数组:

// 调用示例
char buf[STRING_LENGTH] = "Testing";
reverseOneString(buf);

修改函数,去掉s = "Testing";这行:

char* reverseOneString(char s[STRING_LENGTH])
{
    char temp;                  
    char* ptr = &s[0];          
    int len = strlen(s);
    
    char* end = &s[0];
    for (int i = 0; i < len - 1; i++) {
        end++;
    }
    printf("%c, %c\n", *ptr, *end);
    for (int i = 0; i < len / 2; i++) {
        printf("Schwop");
        temp = *end;
        *end = *ptr;
        *ptr = temp;
        printf("%c", *end);

        ptr++;
        end--;
    }
    return s; // 返回传入的数组指针,内存有效
}

方式2:函数内部创建可写数组

如果要在函数内部测试,需要把字符串常量复制到局部可写数组中:

char* reverseOneString(char s[STRING_LENGTH])
{
    char temp_buf[STRING_LENGTH];
    strcpy(temp_buf, "Testing"); // 将只读常量复制到可写数组
    s = temp_buf;
    
    char temp;                  
    char* ptr = &s[0];          
    int len = strlen(s);
    
    char* end = &s[0];
    for (int i = 0; i < len - 1; i++) {
        end++;
    }
    printf("%c, %c\n", *ptr, *end);
    for (int i = 0; i < len / 2; i++) {
        printf("Schwop");
        temp = *end;
        *end = *ptr;
        *ptr = temp;
        printf("%c", *end);

        ptr++;
        end--;
    }
    // 注意:不要返回temp_buf,局部数组在函数结束后会被销毁,返回会导致野指针
    return NULL; // 或者直接将函数改为void类型
}

另外补充:原函数声明了char*返回类型但未返回值,会触发编译器警告,建议要么改成void reverseOneString(...),要么返回有效的指针(如方式1中的s)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:55:21