我试图将此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);
}
可能会出现问题,因为您的dest1
和dest2
字符串不是明确地 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"
这里分配5个字节的内存
char *dest1 = malloc(5 * sizeof(char));
这里,您将字符串的4个字节复制到此缓冲区中
memcpy(dest1, src, 4);
这意味着剩余的第5个字节未初始化。现在在这里
strcmp(dest1, "FLSZ")
您将缓冲区与字符串“ FLSZ”进行比较。通过逐字节比较前四个字符来执行此操作。
然后,strcmp()
访问第五个字节,因为字符串尚未终止。但是,此第五个字节是未初始化。可能是偶然的零字节,导致strcmp()
工作,但是valgrind检测到未初始化字节的访问,并抱怨条件分支/跳转基于未初始化值。
您可以通过在复制字符串后手动将字符串结尾为零来解决此问题。