C malloc 和 memcpy 在拆分 char 数组时给出条件跳转 valgrind 错误

标签 c linux malloc valgrind memcpy

我试图将这个 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/

相关文章:

c - C(Linux) 中的 fopen 返回 "Too many open files"

calloc() 函数代替 malloc()

c - 为什么 ioctl 调用没有传递给 sys_ioctl?

c - malloc 放入 "garbage"值

c - 为什么需要堆分配?

c - 嵌入式 C 语言中的宏如何影响内存?

c - 如何确定用 "register"说明符定义的变量是否存储在 CPU 寄存器中?

c - 如果我们首先在 if 或 while 中使用 fork() 为什么会返回双零

c - UDP 服务器只响应一个客户端

c - 内核空间中的信号处理