在我的代码上运行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;意思? 〜
答案 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
,则将其视为错误。)
就此而言,您可能根本不需要y
。 x
已经是指向字符串的指针。您将其复制到为y
分配的内存中,然后将其复制到aux->nome
。除非有更多的代码告诉我们使用y
,否则这是不必要的(并且内存泄漏!)。您可以删除y
的声明和初始化它的代码,只需直接从x
复制:
Lista_Hashtags *aux = malloc(sizeof *aux);
strcpy(aux->nome, x);
(这假设aux->nome
是一个数组,而不是指针,并且它足以容纳字符串的副本。)
(请注意,我已将您的malloc
电话更改为更简单,更健壮的表单。)