2016-10-05 4 views
0

구조체 멤버에 4096 개의 문자열을 저장하려는 고유 한 경우가 있습니다. 그러나, 나는 짧은 문자열 메모리의 보통 양을 mallocing 해요,하지만 여전히 Valgrind의 오류가 점점 오전 :큰 문자열을 mallocing 할 때 크기 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

그러나 잠시 기다려주세요. 문자열의 길이가 더 늘어났습니다. 널 종료자를 위해 1을 더한 것입니다. 여기서 무슨 일이 일어나고있는 걸까요?

는 사실 난이 시도 :

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

을 그리고 도대체 나는 심지어 malloc을 호출 한 후 문자열 종료 null로 시도 .. 아무 소용

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 자체는 null로 끝나지 않으므로 strlen(bigString)bigString에 할당 된 공간의 끝을지나 읽으려고합니다.

1

BigString 끝에 \0을 추가하는 것을 잊어 버렸습니다.

관련 문제