在我的代码上运行Valgrind后,我得到了一个错误:
uninitialized value was created by a heap allocation.
我的代码:
void adicionaHashtag(char* x){
char*y=malloc(sizeof(x));/***ERROR IS HERE***/
int i;
for(i=0; i<strlen(x); i++){
y[i]=tolower(x[i]);
}
Lista_Hashtags*aux = (Lista_Hashtags*)malloc(sizeof(Lista_Hashtags));
strcpy(aux->nome, y);
aux->contador=1;
if(contador_unitario == 0){
ultimo = aux;
}
contador_unitario++;
aux->proximo = primeiro;
primeiro = aux;
}
有什么建议吗?
另外,"条件跳转或移动取决于未初始化的值"是什么意思?~
"未初始化的值…"您可以使用char*y=calloc(strlen(x),0);
而不是char*y=malloc(sizeof(x));
。用"0"初始化内存。
void adicionaHashtag(char* x){
char*y=malloc(sizeof(x));/***ERROR IS HERE***/
int i;
for(i=0; i<strlen(x); i++){
y[i]=tolower(x[i]);
}
您正试图使用x
指向的字符串的副本来分配和初始化字符串。
sizeof(x)
是char*
指针的大小。这通常是4或8个字节。您需要分配足够的空间来容纳字符串本身。
char *y = malloc(strlen(x) + 1);
+ 1
是为了允许终止空字符' '
。
在循环的每次迭代中调用strlen
是低效的,但不是错误的;我暂时不谈。如果复制的任何字符都有负值(这是tolower()
函数的一个不幸特征。赋值应该是:
y[i] = tolower((unsigned char)x[i]);
最后,假设x
指向字符串"hello"
。您正确地复制了5个字符,但没有复制最终的' '
。一个可能的解决方案是将循环条件中的<
更改为<=
,这将复制字符0到5,而不是0到4。
但您可以使用现有的strcpy
函数,它可以为您处理所有这些(并且更有效):
char *y = malloc(strlen(x) + 1);
strcpy(y, x);
(您还应该检查malloc
返回的值,如果是NULL
,则将其视为错误。)
就这一点而言,您可能根本不需要y
。x
已经是一个指向字符串的指针。您可以将其复制到分配给y
的内存中,然后将它复制到aux->nome
中。除非您还没有向我们展示更多使用y
的代码,否则这是不必要的(还有内存泄漏!)。您可以删除y
的声明和初始化它的代码,然后直接从x
复制:
Lista_Hashtags *aux = malloc(sizeof *aux);
strcpy(aux->nome, x);
(这假设aux->nome
是一个数组,而不是指针,并且它足够大,可以容纳字符串的副本。)
(注意,我已经将您的malloc
调用更改为更简单、更健壮的形式。)