为什么在我仍然可以访问这些位置时遇到段错误?

BOD*_*DDY 3 c string reverse pointers segmentation-fault

我试图使用两个指向相同字符串的指针就地反转一个字符串.第一个(char *p)指向字符串的起始位置,第二个(char *q)指向字符串的结束位置.因此,当我尝试使用gdb进行调试时,我在第16行遇到了分段错误.

当我试图打印的价值*p*q,它工作正常.为什么我仍然能够访问这些位置时遇到段错误?

Breakpoint 1, main () at reverse.c:16
16          *q = *p;
(gdb) print p
$1 = 0x5555555547e4 "hello"
(gdb) print q
$2 = 0x5555555547e8 "o"
(gdb) step

Program received signal SIGSEGV, Segmentation fault.
0x00005555555546db in main () at reverse.c:16
16          *q = *p;
Run Code Online (Sandbox Code Playgroud)

该程序的实际代码是

#include<stdio.h>

int main() {
    char *array = "hello";

    char *p=&array[0];// pointer to the first element

    // Make q point to last value of the array
    char *q = &array[0];
    while(*q) q++; 

    char temp;
    q--; // move left so that we don't point to `\0`
    while(p<q){ 
        temp = *p;
        *q = *p;
        *p = temp; 
        p++;q--;    
    }

    printf(" Done reversing \n");
}
Run Code Online (Sandbox Code Playgroud)

Kar*_*oop 6

您调用的字符串array实际上不是char数组,而是字符串文字,取决于平台,它不可写.所以改成它

char array[] = "Hello";
Run Code Online (Sandbox Code Playgroud)

char *array = "string"和之间有区别char array[] = "string".

  • char *array = "string"提出"string"只读存储器的部分,使array指向它.因此,任何改变存储器内容的尝试array都将导致seg错误(换句话说是非法的).
  • char array[] = "string"放入内存"string"只读部分并将其复制array指向的堆栈上新分配的内存.因此,对内存进行更改array是合法的.

您也可以查看这篇文章.


归档时间:

查看次数:

60 次

最近记录:

7 年,11 月 前