未初始化的值是由堆分配创建的。为什么呢?

时间:2016-05-11 17:24:12

标签: c initialization allocation

在我的代码上运行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;
}

任何提示?

另外,&#34;有条件的跳跃或移动取决于未初始化的值&#34;意思? 〜

2 个答案:

答案 0 :(得分:1)

&#34;未初始化的价值......&#34; 您可以使用char*y=calloc(strlen(x),0);代替char*y=malloc(sizeof(x));。使用&#34; 0&#34;初始化内存。

答案 1 :(得分: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允许终止空字符'\0'

在循环的每次迭代中调用strlen是低效的,但不是不正确的;我现在就离开了。如果任何复制的字符具有负值(tolower()函数的不幸特征,则存在潜在问题。分配应该是:

y[i] = tolower((unsigned char)x[i]);

最后,让我们说x指向字符串"hello"。您正确地复制了5个字符 - 但不是最终的'\0'。一种可能的解决方法是将循环条件中的<更改为<=,这将复制字符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电话更改为更简单,更健壮的表单。)