我试图将这个 char 数组分成两部分,前 4 个字符是一部分,其余部分是第二部分它可以工作,但我在 valgrind 上遇到条件跳转问题 任何人都可以建议解决这个问题
#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 检测到未初始化字节的访问并提示,条件分支/跳转基于未初始化的值。
您可以通过在复制字符串后手动以零终止字符串来解决此问题。
关于C malloc 和 memcpy 在拆分 char 数组时给出条件跳转 valgrind 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59467101/