Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Valgrind的读写错误_C_Memory_Binary_Char_Valgrind - Fatal编程技术网

C Valgrind的读写错误

C Valgrind的读写错误,c,memory,binary,char,valgrind,C,Memory,Binary,Char,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*,因此我有以下代码:

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;
}
这是我的主要目标()…

intmain(intargc,char const argv[]){
char binaire=tab_binaire(12);
printf(“%s\n”,二进制文件);
比内尔解放者(比内尔);
返回0;
}

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

您为char分配了一个指针,因此存在类型冲突,其修复方法如下:

char *binaire = tab_binaire(12); 

谢谢,但我不想在res中添加结束字符串,我真的想添加“0”字符,以将字符串设置为8中的规范化格式bits@TomRibardiere,啊,你以前没提过,但是你能试试最新的答案吗,是的,现在二进制数的格式很好,但我总是使用相同的valgrind errorsah,它来自
malloc(zeroManquant*sizeof(char))尝试将其更改为
malloc(9*sizeof(char))问题在于
strcat
试图写入的内存位置在为该进程分配的内存地址之外。换句话说,除了终止的空字符
'\0'
外,您没有为整个字符串分配足够的内存。发布的代码无法编译!除其他外,它缺少所需的
#include
语句,用于
string.h
stdlib.h
stdio.h
OT:关于语句:
char*res=(char*)malloc(zeroManquant*sizeof(char))
char*str=(char*)malloc(sizeof(char)*8)1)返回的类型是
void*
,可以分配给任何指针。强制转换只会使代码混乱,使其更难理解、调试等。建议删除强制转换。2) 标准中将表达式
sizeof(char)
定义为1。将参数乘以1绝对没有效果。建议删除该表达式。3) 始终检查(!=NULL)返回值,以确保操作成功。关于:
int-main(int-argc,char-const-argv[]){
由于未使用这两个参数,编译器将输出有关未使用参数的两条警告消息。建议在函数:
main()中使用签名:
int-main(void)
此语句:
char binaire=tab\u binaire(12);
函数:
tab\u binaire()
返回指向char的指针,而不是char,因此此语句不会编译。编译时,始终启用警告,然后修复这些警告。(对于
gcc
,至少使用:
-Wall-Wextra-Wconversion-pedantic-std=gnu11
)注意:其他编译器使用不同的选项来获得相同的结果OT:但是,发布的代码只包含不到30行;来自valgrind的消息表示范围为140、145、161的语句。请发布导致问题的实际代码。通常,发布您已编译代码的消息
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] = '\0';
    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; 
    }
char binaire = tab_binaire(12); 
char *binaire = tab_binaire(12);