c - 如何查找C代码中的段错误?

标签 c segmentation-fault

#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); .

关于c - 如何查找C代码中的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44655585/

相关文章:

c++ - 在 C++ 中关闭 mysql 连接时出现段错误。如何解决?

c - 为什么我的 float 相差 0.00390625?

c - 通过 ICU4C 进行 Unicode 规范化

c++ - 段错误: 11 c++ when using vector

c++ - 虚函数调用段错误

c++ - 取消引用从线程返回的指针导致;段错误 : 11

c - 读取正在执行的指令

c - 发布大页面的正确方法?

c - 比 rand() 快?

c++ - 什么会导致在构造子进程期间调用父进程的析构函数?