使用 Valgrind 写入和读取错误

Write and read errors with Valgrind

我尝试将整数转换为二进制格式,我希望结果为 char*,所以我有以下代码:

unsigned int_to_int(unsigned k) {
    if (k == 0) return 0;
    if (k == 1) return 1;                       /* optional */
    return (k % 2) + 10 * int_to_int(k / 2);
}

char* tab_binaire(int nb){
    char* str = (char*) malloc(sizeof(char)*8);
    sprintf(str, "%d", int_to_int(nb));
    int zeroManquant = 8-strlen(str);V
    char* res= (char*) malloc(zeroManquant*sizeof(char));
    for (int i = 0; i < zeroManquant; i++) {
        res[i]='0';
    }
    strcat(res,str);
    free(str);
    str=NULL;
    return res;
}

我已经尝试将退出字符放在字符串的末尾,但我总是会出错。 这是我的错误:

==10789== Invalid read of size 1
==10789==    at 0x483B924: strcat (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==10789==    by 0x1097C3: tab_binaire (automate.c:145)
==10789==    by 0x10983F: main (automate.c:161)
==10789==  Address 0x4a54ae4 is 0 bytes after a block of size 4 alloc'd
==10789==    at 0x483874F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==10789==    by 0x109787: tab_binaire (automate.c:140)
==10789==    by 0x10983F: main (automate.c:161)

==10789==
==10789== Invalid write of size 1
==10789==    at 0x483B940: strcat (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==10789==    by 0x1097C3: tab_binaire (automate.c:145)
==10789==    by 0x10983F: main (automate.c:161)
==10789==  Address 0x4a54ae4 is 0 bytes after a block of size 4 alloc'd
==10789==    at 0x483874F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==10789==    by 0x109787: tab_binaire (automate.c:140)
==10789==    by 0x10983F: main (automate.c:161)
==10789==
==10789== Invalid write of size 1
==10789==    at 0x483B94F: strcat (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==10789==    by 0x1097C3: tab_binaire (automate.c:145)
==10789==    by 0x10983F: main (automate.c:161)
==10789==  Address 0x4a54ae8 is 4 bytes after a block of size 4 alloc'd
==10789==    at 0x483874F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==10789==    by 0x109787: tab_binaire (automate.c:140)
==10789==    by 0x10983F: main (automate.c:161)

这是我的 main()...

 int main(int argc, char const argv[]) { 
    char binaire = tab_binaire(12); 
    printf("%s\n", binaire ); 
    liberer_binaire(binaire); 
    return 0; 
    }

尝试以下调整(您的代码存在一些问题):

unsigned int_to_int(unsigned k);
char* tab_binaire(int nb);
unsigned int_to_int(unsigned k) {
    if (k == 0) return 0;
    if (k == 1) return 1;                       /* optional */
    return (k % 2) + 10 * int_to_int(k / 2);
}

char* tab_binaire(int nb){
    char* str = (char*) malloc(sizeof(char) * 9);
    sprintf(str, "%d", int_to_int(nb));
    int zeroManquant = 8 - strlen(str);
    char* res= (char*) malloc(9 * sizeof(char));
    int i;
    for (i = 0; i < zeroManquant; i++) {
        res[i]='0';
    }
    res[i] = '[=10=]';
    strcat(res,str);
    free(str);
    str=NULL;
    return res;
}

int main(int argc, char const argv[]) { 
    char *binaire = tab_binaire(12); 
    printf("%s\n", binaire );
    free(binaire);
    //liberer_binaire(binaire); 
    return 0; 
    }

上面的 valgrind 错误意味着您正在尝试访问内存(readwrite) 超出了为变量分配的区域。

使用 for 循环通过 '0' 填充字符串 res 的开头后,您需要将空字符 '[=16=]' 放在末尾,因此 strcat 从这个位置复制第二个字符串。

此时:

char binaire = tab_binaire(12); 

您正在为 char 分配一个指针,因此您遇到了类型冲突,它已简单地修复如下:

char *binaire = tab_binaire(12);