【发布时间】:2018-09-10 03:29:12
【问题描述】:
我正在尝试使用两个指向同一字符串的指针就地反转字符串。第一个(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;
程序的实际代码是
#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");
}
【问题讨论】:
-
与您的问题无关,但应该是
temp = *q,您现在有temp=*p和后来的*p=temp,什么都不做 -
您遇到了段错误,因为您正在尝试写入只读内存。
标签: c string pointers segmentation-fault reverse