我的目标是使反向两位数如123456到563412.我使用valgrind工具来检查内存泄漏问题,但strlen(reverse_chr)
函数会出现此错误:
条件跳转或移动取决于未初始化的值
这是我的代码:
#include <stdio.h>
#include <string.h>
#include <string>
int main()
{
char chr[] = "123456";
char* reverse_chr=(char *) malloc(strlen(chr)+1);
memset(reverse_chr, 0, strlen(chr));
int chrlen=strlen(chr);
for (int t=0; t<chrlen; t+=2)
{
reverse_chr[t]=chr[chrlen-t-2];
reverse_chr[t+1]=chr[chrlen-t-1];
}
int len_reverse_chr = strlen(reverse_chr);
free(reverse_chr);
return 0;
}
我期望输出没有任何valgrind错误。
问题是reverse_chr
不是有效的字符串,因为它没有正确终止。
char* reverse_chr=(char *) malloc(strlen(chr)+1);
memset(reverse_chr, 0, strlen(chr));
您分配7个字节,但只将前6个设置为0
。
for (int t=0; t<chrlen; t+=2)
{
reverse_chr[t]=...
reverse_chr[t+1]=...
这个for
循环也只写入reverse_chr
的前6个元素。
int len_reverse_chr = strlen(reverse_chr);
然后这一行尝试在reverse_chr
中找到一个NUL字节,但是前6个元素不是'\0'
而第7个元素是未初始化的(因此valgrind的抱怨)。
固定:
要么这样做
reverse_chr[chrlen] = '\0';
循环之后,或使用calloc
:
reverse_chr = static_cast<char *>(calloc(strlen(chr)+1, sizeof *reverse_chr));
这样就可以初始化所有分配的字节(并且不再需要memset
)。