如何在 C 代码中查找分段错误


#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;
}

但是这段代码仍然存在问题:

  1. --*ptr1----*--ptr1这样的结构是没有意义的。甚至可能是未定义的行为(不确定(。
  2. printf("%c", ptr1);在未定义的行为中产生,因为格式说明符%cptr1的类型不匹配。这将是正确的:printf("%p", ptr1);.

相关内容

  • 没有找到相关文章

最新更新