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

VS2022中C语言字符串升序函数无输出且触发访问违例错误求助

解决C语言字符串排序时的访问违例错误(Visual Studio 2022)

问题根源

  • main函数中char* aList[5]的元素指向字符串字面量,这类字符串存储在程序的只读数据段,不允许被修改。
  • 原SortString函数通过strcpy_s直接向aList[i]、aList[j]指向的内存写入数据,试图修改只读内存,触发了0xC0000005访问违例错误。

修正方案

不需要交换字符串内容,直接交换指针本身即可实现排序效果,既高效又避免了写入只读内存的问题。修正后的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void SortString(char** aList, int index) {
    int i = 0;
    int j = 0;
    char* temp; // 用指针变量存储待交换的指针
    for (i = 0; i < index - 1; ++i) {
        for (j = i + 1; j < index; ++j) {
            // 使用strcmp比较完整字符串,替代原strncmp的截断比较
            if (strcmp(aList[i], aList[j]) > 0) {
                temp = aList[i];
                aList[i] = aList[j];
                aList[j] = temp;
            }
        }
    }
}

int main() {
    char* aList[5] = {
        "abc",
        "def",
        "ab",
        "bcd",
        "ae"
    };
    int i = 0;
    SortString(aList, 5);
    for (i = 0; i < 5; ++i) {
        printf("%s\n", aList[i]);
    }
    return 0;
}

补充说明

  1. 指针交换优势:仅改变指针指向,不修改字符串内容,完全规避只读内存的写入限制,同时比拷贝字符串内容效率更高。
  2. 字符串比较优化:原代码用strncmp会截断字符串比较,改用strcmp能正确比较完整字符串的字典序。
  3. 可写内存场景提示:若确实需要修改字符串内容,需确保aList中的指针指向可写内存(如通过malloc分配堆内存,再用strcpy_s拷贝字符串字面量)。

内容的提问来源于stack exchange,提问作者권오성

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:45:19