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)
您调用的字符串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 次 |
| 最近记录: |