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

问题描述 投票:0回答:2

我试图将此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);
}
c linux malloc valgrind memcpy
2个回答
0
投票

可能会出现问题,因为您的dest1dest2字符串不是明确地 NUL终止:对printf(使用%s格式)和strcmp的调用要求字符串以NUL终止。

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

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

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

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

0
投票

这里分配5个字节的内存

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

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

memcpy(dest1, src, 4);

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

strcmp(dest1, "FLSZ")

您将缓冲区与字符串“ FLSZ”进行比较。通过逐字节比较前四个字符来执行此操作。

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

您可以通过在复制字符串后手动将字符串结尾为零来解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.