2016-05-11 14 views
0

私のコード上での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; 
} 

任意のヒントは?

「条件付きジャンプまたは移動は初期化されていない値に依存する」とはどういう意味ですか? 〜

+7

のsizeof 'の使用(X)'が間違っています。 'strlen(x)+ 1'に等しいメモリを' y'に割り当てます。 – ameyCU

+2

また、 '\ 0'を' y'に追加することを忘れないでください。そうしないと 'strcpy'に問題があります。 –

+0

「noob」の質問は事前にお詫び申し上げます。どのようにexally yに\ 0を追加する必要がありますか? strcpyは本当に問題を起こしています。 @ジョニー・モップ –

答えて

1

"初期化されていない値..." あなたが "0" に代わりchar*y=malloc(sizeof(x)); .Initializeのメモリをchar*y=calloc(strlen(x),0);を使用することができます。あなたは、文字列のコピーで文字列を割り当て、初期化しようとしている

+0

または、割り当て後にメモリを初期化することができます。全ビット・ゼロは、有効な初期値であってもなくてもよい。たとえば、ヌルポインタは通常、全ビット0で表されますが、実際には保証されません。 –

+2

サイズはヌルターミネータのために+1が必要です –

+0

@KeithThompsonすべてのビット0は、整数型であるため、 'char'には有効です –

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]); 
最後に

、の文字列"hello"xポイントを言わせてあなたは正しくコピーしています。 5つの文字 - 。ではなく、最終的な'\0'一つの可能​​な修正は4

0〜5までの文字0をコピーするのではなくなる、<=にループ条件で<を変更することです。しかし、あなたは、単に既存の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の呼び出しを変更したことに注意してください。)

+0

@MichaelBurr: 'strdup'は非標準であることに注意してください。 –

関連する問題