当前位置:  开发笔记 > 编程语言 > 正文

如何解释此调试错误

如何解决《如何解释此调试错误》经验,为你挑选了1个好方法。

作为一名训练有素的黑客,我决定自己创建一个string_reverse函数,它接受一个字符串,为一个新字符串分配内存,并返回一个指向新字符串的指针,但是我没有得到我想要的东西,这会返回分段错误.

#include 
#include 


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

我该如何解释这个结果?



1> JaredPar..:

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

将malloc行更改为以下内容

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

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

result[len] = '\0';

其他一些评论

不需要sizeof(char).char的大小是C标准定义的少数类型之一,其值为1.

可以通过对strlen的简单调用来替换第一个循环

编辑

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

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

另外,请勿在返回时取消引用结果

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有