2016-12-07 2 views
2

realloc(), getchar() 및 일부 포인터 연산을 사용하여 메모리에 문자 배열을 저장하는 작은 프로그램을 작성하려고합니다.realloc()을 사용하여 코어 덤프를 시도하는 중

char (처음에는 NULL이고 main.c에 선언 된)에 대한 포인터를받는 "inputArray"라는 함수가 있는데 getchar() 함수가 호출 될 때까지 하나의 char로 다시 할당됩니다. '\ n'문자를 얻습니다. 함수는 정상적으로 작동하는 것처럼 보이지만 main.c에서 문자열을 다시 인쇄하려고하면 "분할 오류 (코어가 덤프 됨)"오류가 발생합니다. 나는 몇 시간 동안 찾고 있었고, 문제가있는 곳을 찾을 수 없습니다. 감사!

을 main.c :

# include "convert.h" 

int main() 
{ 
    char * string = NULL; 
    inputArray(string); 
    printf("%s", string);  
    free(string); 
    return 0; 
} 

convert.c :

#include "convert.h" 

void inputArray(char * array) 
{ 
    /*pointer to the array*/ 
    char * ptr = NULL; 

    /*stores the char*/ 
    char c = 0; 

    /*counter used for pointer arithmetic*/ 
    int count = 0; 

    /*loop for getting chars in array*/ 
    while ((c = getchar()) != '\n') 
    { 
     array = realloc(array, sizeof(char)); 
     ptr = array + count; 
     *ptr = c; 
     ++count; 
    } 

    /*add the null char to the end of the string*/ 
    array = realloc(array, sizeof(char)); 
    ptr += count; 
    *ptr = '\0'; 
} 

convert.h :

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

void inputArray(char * array); 
+4

c *에서 참조를 기준으로 * 에뮬레이션을 검색하고 읽습니다. –

+0

'sizeof (char)'는 항상 1 ..... (글쎄, 아마도 너비가 2 배인 문자를 사용하는 경우 2)가 될 것이지만, 원하는 크기가 아닌 고정 된 크기입니다. – gilez

답변

3

새로 할당 된 배열의 크기가 잘못되었습니다. count + 1자를 할당해야합니다.

array = realloc(array, (count + 1) * sizeof(char)); 

메모리를 재 할당하기 위해 임시 포인터를 사용하는 것이 더 안전하다는 것을 고려하십시오. 그렇지 않으면 이전에 할당 된 메모리의 원래 주소가 손실됩니다.

또한

이 문

array = realloc(array, sizeof(char)); 
ptr += count; 

잘못이다. 당신은 적어도
array = realloc(array, count * sizeof(char)); 
ptr = array + count - 1; 

는 또한 함수가

char * inputArray(char * array); 

같이 선언해야합니다 작성해야하며 호출자에게 새로운 포인터를 반환해야합니다.

그리고 주에서

당신은 그렇지 않으면 함수의 매개 변수가

void inputArray(char ** array); 

같이 선언해야하고 함수에 상응하게 처리 할 수있다 참조하여 인수를 받아 들여야

string = inputArray(string); 

를 작성해야합니다.

2

당신은 inputArray 기능에 간접적 인 수준을 누락되었습니다. 그것은

void inputArray(char **array) 

과 같이 선언한다

*array = realloc(*array, (count + 1) * sizeof(char)); 

이처럼 전화 (당신은 또한 count + 1로 곱하여 배열의 크기를 늘려야)과 같이 realloc'd해야합니다

inputArray(&string); 
+0

@BeyelerStudios Oops, 서둘러서의 결과 :-) –

+0

@BeyelerStudios 감사합니다 :-) –