gpt4 book ai didi

c - 如何解释此调试错误

转载 作者:行者123 更新时间:2023-12-04 09:42:45 26 4
gpt4 key购买 nike

作为一名受训黑客,我决定着手制作我自己的 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

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

最佳答案

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

将 malloc 行更改为以下内容

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

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

result[len] = '\0';

一些其他评论

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

编辑

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

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

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

关于c - 如何解释此调试错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/720033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com