2016-10-05 7 views
0

構造体メンバに4096の文字列を格納しようとしているというユニークなケースがあります。しかし、私は短い文字列のためのメモリの通常量をmallocingんだけど、まだvalgrindのエラーを取得しています:大きな文字列をmallocするときにサイズ1の読み込みが無効

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 


struct List { 
    char * name; 
    int grade; 
    struct List * next; 
}; 
int main(void) { 
    struct List * newList; 
    char * bigString; 
    int i; 
    bigString = malloc(sizeof(char)* 4096); 

    for (i=0; i<4096; i++) 
     bigString[i] = 'a'; 


    newList = malloc(sizeof(struct List)); 
    newList->next = NULL; 
    newList->name = malloc(strlen(bigString)+1); 
    free(bigString); 


    free(newList->name); 
    free(newList); 


    return 0; 
} 

ライン:

newList->name = malloc(strlen(bigString)+1); 

戻り値エラーInvalid read of size 1

をしかし、秒を待って、文字列の長さをmallocingしています。ヌルターミネーターに1を加えて、ここで何が起こっていますか?

私もこの試みた事実

:私もmalloc関数の呼び出し後に文字列を終了nullにしようとした

newList->name = malloc(sizeof(char) * strlen(bigString) +1); 

と一体を:

newList->name[strlen(bigString)] = '\0'; 

無駄に...

I実際に私がここで間違ったことについて混乱しています。何か案は?

+0

'bigString = malloc(sizeof(char)* 4096);' - > 'bigString = malloc(sizeof(char)* 4096 + 1); bigString [4096] = 0; ' – BLUEPIXY

+0

サイズ1の無効な書き込みを返す:/ – ererere

+0

' i <4096'を変更しましたか? – BLUEPIXY

答えて

2

bigString自体がヌルターミネーションではないため、strlen(bigString)は、bigStringに割り当てられたスペースの最後を読み取ろうとします。

1

BigStringの末尾に\0を追加しています。

関連する問題