#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *ptr1="abcdef";
ptr1 = ptr1 +(strlen(ptr1)-1);
printf("%c",--*ptr1--);
printf("%c",--*--ptr1);
printf("%c",--*(ptr1--));
printf("%c",--*(--ptr1));
printf("%c",*ptr1);
return 0;
}
上面的代码抛出分段错误错误。有人可以帮助我了解其背后的原因吗?
假设你的程序中有一个拼写错误,你实际上有这个:
char *ptr1 = "abcdef";
// ^<<<<
而不是:
char *ptr = "abcdef";
您正在尝试修改字符串文本,该文本会产生未定义的行为,通常是分段错误。
这是一个最小的程序,它会触发您遇到的那种分段错误:
int main()
{
char *string = "abcdef";
*string = 'X';
}
您可能打算这样做:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char string[] = "abcdef";
char *ptr1 = string + (strlen(string) - 1);
printf("%c", --*ptr1--);
printf("%c", --*--ptr1);
printf("%c", --*(ptr1--));
printf("%c", --*(--ptr1));
printf("%c", ptr1);
return 0;
}
但是这段代码仍然存在问题:
- 像
--*ptr1--
或--*--ptr1
这样的结构是没有意义的。甚至可能是未定义的行为(不确定(。 -
printf("%c", ptr1);
在未定义的行为中产生,因为格式说明符%c
与ptr1
的类型不匹配。这将是正确的:printf("%p", ptr1);
.