使用 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 错误意味着您正在尝试访问内存(read 或 write) 超出了为变量分配的区域。
使用 for
循环通过 '0'
填充字符串 res
的开头后,您需要将空字符 '[=16=]'
放在末尾,因此 strcat
从这个位置复制第二个字符串。
此时:
char binaire = tab_binaire(12);
您正在为 char 分配一个指针,因此您遇到了类型冲突,它已简单地修复如下:
char *binaire = tab_binaire(12);
我尝试将整数转换为二进制格式,我希望结果为 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 错误意味着您正在尝试访问内存(read 或 write) 超出了为变量分配的区域。
使用 for
循环通过 '0'
填充字符串 res
的开头后,您需要将空字符 '[=16=]'
放在末尾,因此 strcat
从这个位置复制第二个字符串。
此时:
char binaire = tab_binaire(12);
您正在为 char 分配一个指针,因此您遇到了类型冲突,它已简单地修复如下:
char *binaire = tab_binaire(12);