c-未初始化的值是由堆分配创建的.为什么?



在我的代码上运行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,则将其视为错误。)

就这一点而言,您可能根本不需要yx已经是一个指向字符串的指针。您可以将其复制到分配给y的内存中,然后将它复制到aux->nome中。除非您还没有向我们展示更多使用y的代码,否则这是不必要的(还有内存泄漏!)。您可以删除y的声明和初始化它的代码,然后直接从x复制:

Lista_Hashtags *aux = malloc(sizeof *aux);
strcpy(aux->nome, x);

(这假设aux->nome是一个数组,而不是指针,并且它足够大,可以容纳字符串的副本。)

(注意,我已经将您的malloc调用更改为更简单、更健壮的形式。)

最新更新