【问题标题】:C memalloc & mempy give conditional jump valgrind error while splitting a char arrayC malloc 和 memcpy 在拆分 char 数组时给出条件跳转 valgrind 错误
【发布时间】:2020-04-15 10:30:23
【问题描述】:

我正在尝试将此 char 数组分成两部分,前 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);
}

【问题讨论】:

  • 您不会终止 dest1dest2 中的数据,而是在它们上使用字符串函数。不行。

标签: c linux malloc valgrind memcpy


【解决方案1】:

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

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

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

memcpy(dest1, src, 4);

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

strcmp(dest1, "FLSZ")

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

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

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

【讨论】:

    【解决方案2】:

    出现问题的原因可能是您的 dest1dest2 字符串没有明确 NUL-终止:对printf 的调用(使用%s 格式)和@987654326 @ 要求字符串为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"
    

    如果没有这些,malloc 调用分配的内存将未初始化,您将进入未定义行为的领域! dest1dest2 字符串的最后一个元素可能为零(这将使您的代码似乎工作)但它们可能不是 - 在这种情况下printfstrcmp 调用将继续在分配的内存缓冲区之外寻找“信号”NUL 终止符。

    【讨论】:

      猜你喜欢
      • 2015-08-04
      • 1970-01-01
      • 2022-11-15
      • 2012-09-26
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多