【问题标题】:How to interpret this debugging error如何解释此调试错误
【发布时间】:2010-10-17 17:29:36
【问题描述】:

作为一名训练中的黑客,我决定制作自己的 string_reverse 函数,该函数接受一个字符串,为新字符串分配内存,并返回一个指向新字符串的指针,但我没有得到我想要的需要,因为这会返回分段错误。

#include <stdio.h>
#include <stdlib.h>


char* string_reverse(char* string);

char* string_reverse(char* string) {
  int len = 0;
  for (int i = 0; *(string + i) != '\0'; ++i)
    len++;

  char* result = (char*)malloc(len * sizeof(char));
  if (result == NULL){
    puts("Pointer failure");
    exit(EXIT_FAILURE);
  }

  for (int i = 0; *(string + i) != '\0'; ++i)
    *(result + (len - i)) = *(string + i);

  return *result;
}

int main() {
  char* str= "Ni Hao!";
  char* result = string_reverse(str);

  printf("%s\n", result);
  free(result);
  return 0;
}

作为回报,我收到以下调试消息:

Starting program: /home/tmo/string_reverse 

Program received signal SIGSEGV, Segmentation fault.
0xb7e5b3b3 in strlen () from /lib/i686/cmov/libc.so.6

我应该如何解释这个结果?

【问题讨论】:

  • 注意你的编译器给你的警告。如果它没有给你任何东西,那就得到一个更好的编译器。 GCC 说:x.c: In function `string_reverse': x.c:21: warning: return makes pointer from integer without a cast

标签: c debugging segmentation-fault


【解决方案1】:

您的代码没有将空终止符添加到反向字符串。结果 printf 函数在试图计算它的长度时崩溃了。

将 malloc 行更改为以下内容

char* result = (char*)malloc((len+1) * sizeof(char));

并且您需要将以下行添加到 string_reverse 函数的末尾,以确保字符串具有空终止符。

result[len] = '\0';

其他几个cmets

  • 不需要sizeof(char)。 char 的大小是 C 标准定义的少数类型之一,其值为 1。
  • 第一个循环可以替换为对 strlen 的简单调用

编辑

另外两个问题。实际执行字符复制的行似乎不正确。我相信它应该是(len - i - 1)。否则,初始字符写入将发生在 (result + len) 处,这是空终止符的位置。

*(result + ((len - i) - 1)) = *(string + i);

另外,不要在返回时取消引用结果

【讨论】:

  • 不幸的是,我仍然收到来自代码的分段错误错误。
【解决方案2】:

此外,您不应该在函数末尾取消引用结果,因为它已经是指向您的结果字符串的指针。

return result;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多