gpt4 book ai didi

c - Valgrind "Invalide write of size 1"

转载 作者:行者123 更新时间:2023-12-05 04:00:21 25 4
gpt4 key购买 nike

下面我写了一个函数_getstr(),不用scanf就可以获取输入的字符串。但是,运行 valgrind 会导致“大小 1 的无效写入”错误。每个输入都会发生这种情况。是什么导致了这个错误?

char *_getstr(){
char *str = NULL;
int bufsize = 0, c = 0;
do {
c = getchar();
if (c != '\n'){
str = realloc(str, (bufsize + 1)*sizeof(char));
str[bufsize++] = c;
}
} while (c != '\n');
str[bufsize] = '\0';
return str;
}

主要是我这样做:

char *s1 = _getstr();

当我插入输入时,valgrind 的输出是这样的:

Insert of the first string: hello
==6830== Invalid write of size 1
==6830== at 0x109294: _getstr (changeJOIN.c:43)
==6830== by 0x10919B: main (changeJOIN.c:15)
==6830== Address 0x4a419b4 is 0 bytes after a block of size 4 alloc'd
==6830== at 0x4839D7B: realloc (vg_replace_malloc.c:826)
==6830== by 0x109264: _getstr (changeJOIN.c:39)
==6830== by 0x10919B: main (changeJOIN.c:15)

最佳答案

当您添加终止空字节时,str 指向 bufsize 字节,因此 str[bufsize] = '\0'; 写入超出已分配内存末尾的一个元素。这就是它提示的 valgrind。

在添加空终止符之前,您需要再分配一个字节。

str = realloc(str, (bufsize + 1)*sizeof(char));
str[bufsize] = '\0';

关于c - Valgrind "Invalide write of size 1",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56280911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com