作为一名训练有素的黑客,我决定自己创建一个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
我该如何解释这个结果?
答案 0 :(得分:10)
您的代码未将空终止符添加到反向字符串。结果,printf函数崩溃,试图计算它的长度。
将malloc行更改为以下
char* result = (char*)malloc((len+1) * sizeof(char));
并且您需要将以下行添加到string_reverse函数的末尾,以确保该字符串具有空终止符。
result[len] = '\0';
其他一些评论
修改强>
另外两个问题。实际执行字符复制的行似乎不正确。我相信它应该是(len - i - 1)。否则,初始字符写入将发生在(结果+ len),这是空终止符的位置。
*(result + ((len - i) - 1)) = *(string + i);
此外,请勿在返回时取消引用结果
答案 1 :(得分:4)
此外,您不应该在函数末尾取消引用结果,因为它已经是指向结果字符串的指针。
return result;