【问题标题】:How to find a segmentation fault in C code?如何在 C 代码中查找分段错误?
【发布时间】:2017-06-20 14:17:18
【问题描述】:
#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;
}

以上代码抛出分段错误错误。有人可以帮我理解背后的原因吗?

【问题讨论】:

  • 原因是糟糕的、不可读的代码,可能会调用未定义的行为。
  • 顺便说一句,它甚至不会编译。
  • 请简要解释一下
  • 无法编译为 ptr1 未定义
  • 请发布可编译的代码。你是说char *ptr1="abcdef"; 吗?

标签: c segmentation-fault


【解决方案1】:

假设您的程序中有错字,而您实际上有这个:

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

【讨论】:

  • 抱歉有太多错别字。我现在已经更正了代码。这个问题是在编码难题测试中提出的,答案中没有一个选项提到任何错误。以下是选项: a) ecbaa b) edcbb c) fedaa d) Ecdbb
  • 这个谜题是由不了解未定义行为的人编写的。
  • 能否简要解释一下未定义的行为
  • 我只是想知道程序内部是如何工作的
  • @RohitJangra 点击这里:--> Undefined behaviour
猜你喜欢
  • 2022-01-09
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 2012-05-16
相关资源
最近更新 更多