2014-11-23 3 views
0

동안 나는 다음에 에 필요한 경우에만 메모리를 할당하려고합니다. 동적 메모리 할당

char *str = malloc(sizeof(char)); int i = 0; while(something == true){ str[i] = fgetc(fp); str = realloc(str, strlen(str)+1); i++; } free(str); 

그러나 어떤 이유로 위의 코드 나 strlen에서 나에게
"크기 1의 잘못된 읽기"를 제공합니다().

+3

'str'는'0되지 않습니다 :

이 시간 할당에

덩어리는 ... 텍스트를 읽을 수 없습니다와 나 strlen, strcat와 같은 기능을 사용할 계획이없는 경우에 '-terminated, 그러므로'strlen (str)'은 정의되지 않은 행동이다. 'realloc (str, i + 2);를 시도하십시오. – AlexD

+1

매우 효율적이지 않습니다. 상한 또는 1k의 청크로 재 할당 할 것인가? 또한 strlen을 반복적으로 사용하는 것을 피하십시오. –

+0

'i + 2'로 작업했습니다. 고맙습니다! – Christopher

답변

3

strlen은 null로 끝나는 문자열이 포함되어 있어도 할당 된 char 배열의 크기를 결정하지 않습니다. 전반적인 코드 구조가 마음에 들지 않지만 제안 된 수정 내용을 확인하십시오. 추가 할당 문자로 끝납니다.

char *str = malloc(sizeof(char)); 
int i = 0; 

while(something == true){ 
    str[i] = fgetc(fp); 
    str = realloc(str, (i+2)*sizeof(char)); 
    i++; 
} 
// str[i*sizeof(char)]='\0'; <-- Add this if you want a null terminated string 

free(str); 

내가 여분의 문자 할당 피할 것이다 다음 코드를 제안 할 것입니다 : 문서 당으로

char *str = NULL; 
int i = 0; 

while(something == true){ 
    str = realloc(str, (i+1)*sizeof(char)); 
    str[i] = fgetc(fp); 
    i++; 
} 

free(str); 

, "경우에 널 포인터 ptr에, 함수는 할당, malloc에 ​​같은 동작 size 바이트의 새로운 블록과 그 시작 부분에 포인터를 반환합니다. "

char *str = malloc(sizeof(char)); 
int i = 0; 
const int chunk_size = 100; 

while(something == true){ 
    str[i] = fgetc(fp); 
    if (i % chunk_size == 0) 
     str = realloc(str, (i+1+chunk_size)*sizeof(char)); 
    i++; 
} 
// str[i*sizeof(char)]='\0'; <-- Add this if you want a null terminated string 

free(str); 
+0

@AlexD는 (1 + 2)로 작업했습니다. – Christopher

+0

@idknow 네, 저기에서 실수했습니다. – Tarik

+0

@AlexD 정확합니다. 죄송합니다! – Tarik