#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);
.
关于c - 如何查找C代码中的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44655585/