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; }
补充说明
- 指针交换优势:仅改变指针指向,不修改字符串内容,完全规避只读内存的写入限制,同时比拷贝字符串内容效率更高。
- 字符串比较优化:原代码用
strncmp会截断字符串比较,改用strcmp能正确比较完整字符串的字典序。 - 可写内存场景提示:若确实需要修改字符串内容,需确保
aList中的指针指向可写内存(如通过malloc分配堆内存,再用strcpy_s拷贝字符串字面量)。
内容的提问来源于stack exchange,提问作者권오성
相关产品推荐
相关产品推荐

