C Valgrind的读写错误
我尝试将整数转换为二进制格式,并希望结果为char*,因此我有以下代码: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 =
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);