C memalloc & mempy 在拆分字符数组时给出条件跳转 valgrind 错误



我正在尝试将这个字符数组分成两部分,前 4 个字符是一部分,休息是第二部分 它的工作,但我在瓦尔格林德上遇到条件跳转问题 任何人都可以建议解决这个问题吗

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
const char src[50] = "FLSZGRGR";
char *dest1 = malloc(5 * sizeof(char));
memcpy(dest1, src, 4);
printf("%s n", dest1);
if (strcmp(dest1, "FLSZ") == 0)
printf("EQUAL 1 n");
char *dest2 = malloc(5 * sizeof(char));
memcpy(dest2, src + 4, 4);
printf("%s n", dest2);
if (strcmp(dest2, "GRGR") == 0)
printf("EQUAL 2 n");
free(dest1);
free(dest2);
return (0);
}

在这里,您分配 5 个字节的内存

char *dest1 = malloc(5 * sizeof(char));

在这里,您将字符串的 4 个字节复制到此缓冲区中

memcpy(dest1, src, 4);

这意味着,剩余的第 5 个字节未初始化。现在在这里

strcmp(dest1, "FLSZ")

您将缓冲区与字符串"FLSZ"进行比较。这是通过逐个字节比较前四个字符来执行的。

然后,strcmp()访问第五个字节,因为字符串尚未终止。但是,这第五个字节未初始化。巧合的是,它可能是一个零字节,导致strcmp()工作,但 valgrind 检测到未初始化字节的访问并抱怨,条件分支/跳转基于未初始化的值。

可以通过在复制字符串后手动将字符串归零终止来解决此问题。

可能会出现这些问题,因为您的dest1dest2字符串没有显式NUL终止:对printf(使用%s格式(和strcmp的调用要求字符串NUL终止。

若要解决此问题,可以将最后一个char元素显式设置为NUL字符:

memcpy(dest1, src, 4);
dest1[4] = ''; // Explicitly set NUL terminator (do the same for "dest2")

或使用calloc代替malloc(这会将所有元素设置为零(:

char *dest1 = calloc(5, sizeof(char)); // And similarly for "dest2"

如果没有这些,malloc调用分配的内存将未初始化,您将进入未定义行为的领域!dest1dest2字符串的最后一个元素可能为零(这将使您的代码看起来有效(,但它们可能不是 - 在这种情况下,printfstrcmp调用将继续查找,超出分配的内存缓冲区的末尾,寻找"信号"NUL终止符。

最新更新