Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 试图覆盖常量字符*是错误的访问_C - Fatal编程技术网

C 试图覆盖常量字符*是错误的访问

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

我编写了一个简单的就地字符串反转函数,它在leetcode(面试实践)上工作,但在我自己的系统上出现了一个令人惊讶的糟糕访问错误。这是一个如此简单的函数,调试器告诉我的其他一切似乎都应该是a-OK。为什么我的访问权限不好

#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";