C 试图覆盖常量字符*是错误的访问
我编写了一个简单的就地字符串反转函数,它在leetcode(面试实践)上工作,但在我自己的系统上出现了一个令人惊讶的糟糕访问错误。这是一个如此简单的函数,调试器告诉我的其他一切似乎都应该是a-OK。为什么我的访问权限不好C 试图覆盖常量字符*是错误的访问,c,C,我编写了一个简单的就地字符串反转函数,它在leetcode(面试实践)上工作,但在我自己的系统上出现了一个令人惊讶的糟糕访问错误。这是一个如此简单的函数,调试器告诉我的其他一切似乎都应该是a-OK。为什么我的访问权限不好 #include <string.h> #include <stdlib.h> #include <stdio.h> char* reverseString(char* s) { char *t,*r,tmp; t=r=s; w
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
char* reverseString(char* s) {
char *t,*r,tmp;
t=r=s;
while(*(s++));
s-=2;
while(t<s){
tmp=*t;
*t=*s; //<--- this is where I have a bad access(?)
*s=tmp;
s--;
t++;
}
return r;
}
int main(){
char *s="12345";
reverseString(s);
return 0;
}
#包括
#包括
#包括
char*reverseString(char*s){
字符*t,*r,tmp;
t=r=s;
而(*(s++));
s-=2;
而(t修改字符串常量是未定义的行为。即使将其强制转换为char*
,也不能使其正常
尝试先在堆栈或堆上创建非常量副本。中
int main(){
char *s="12345";
s是一个const char*
。您可以将其分配给char*
(应该会发出警告),但这并不意味着您现在可以更改它。它仍然是一个const
。在旧的操作系统中,这是不受保护的,意味着您可以修改数据存储。这是黑客获取某些内容的101种方法—通过(假定)编写机器代码const字符串,并在以后执行,然后-宾果
较新的操作系统通过将内存页标记为常量数据来保护这一点(并将它们标记为不可执行文件,即windows中的“数据执行保护”).我明白了。所以函数很好,但我不应该给它传递字符串常量。这就解释了为什么leetcode不会抛出错误。这让我担心,如果我不能这样做的话。。。
int main(){
char *s="12345";