使用指针反转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
相关产品推荐
相关产品推荐

