gpt4 book ai didi

C - Valgrind 在我的反向字符串函数中检测到一个错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:30:23 25 4
gpt4 key购买 nike

我写了一个看起来运行良好的小程序,但是当我运行 memcheck 时 valgrind 给我一个奇怪的错误。我在解释错误代码时需要帮助:)

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


int get_length(char* str){
int i=0;
char c = str[0];
while(c!='\0'){
i++;
c=str[i];
}
return i;
}

char* rev(char* str){
int length = get_length(str);
char* x=malloc(length*sizeof(char));
int i;
length-=1;
for(i=0; i<=length; i++){
x[i]=str[length-i];
}
return x;
}

int main(){
char* s=rev("roma");
printf("%s\n",s);
free(s);
}

valgrind 输出如下:

Invalid read of size 1
==14727== at 0x4C29724: __GI_strlen (mc_replace_strmem.c:405)
==14727== by 0x4E9907A: puts (ioputs.c:37)
==14727== by 0x400673: main (in /home/francesco80b/Scrivania/i_a/l-04/main.o)
==14727== Address 0x51ba044 is 0 bytes after a block of size 4 alloc'd
==14727== at 0x4C28D84: malloc (vg_replace_malloc.c:291)
==14727== by 0x400601: rev (in /home/francesco80b/Scrivania/i_a/l-04/main.o)
==14727== by 0x400663: main (in /home/francesco80b/Scrivania/i_a/l-04/main.o)
==14727==
amor
==14727==
==14727== HEAP SUMMARY:
==14727== in use at exit: 0 bytes in 0 blocks
==14727== total heap usage: 1 allocs, 1 frees, 4 bytes allocated
==14727==
==14727== All heap blocks were freed -- no leaks are possible

我还注意到,如果我使用 calloc() 而不是使用 malloc(),valgrind 根本检测不到任何错误。

注意:我写 get_length() 函数只是为了好玩,哈哈

最佳答案

你分配的字符比你需要的少:

char* x=malloc(length*sizeof(char));

应该是

char* x=malloc(length+1);

不需要乘以 sizeof(char),因为标准要求它为 1。添加 1 是必需的,因为您需要一个额外的字符作为空终止符,而您的函数无法添加该字符。这就是当 printf 尝试打印字符串时发生无效读取的原因。

要解决此问题,请分配 length+1,并在返回 x 之前添加 x[length] = '\0';函数。

关于C - Valgrind 在我的反向字符串函数中检测到一个错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23713633/

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