2014-05-17 32 views
1

我写了一个似乎能正常工作的小程序,但是当我运行memcheck时,valgrind给了我一个奇怪的错误。我需要帮助解释错误代码:)C-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 

我也注意到,如果我使用的,而不是使用malloc()释放calloc(),Valgrind的不检测到任何错误。

注:我写的get_length()只是为了好玩功能,笑

回答

4

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

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

应该

char* x=malloc(length+1); 

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

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