2013-02-22 3 views
4

그래서 이상한 과제가 있습니다. 배열 문자열에 파일 내용을 읽어야합니다. 그러나, 나는이 같은 배열을 초기화해야한다 (I 배열의 크기를 1로 초기화해야) : 그래서, realloc을 계속 사용 할내부 및 외부 배열을 다시 할당하는 방법

char **input = (char **)malloc(1*sizeof(char*)) 

대신

char **input = (char **)malloc((sizeOfFile+1)*sizeof(char*)) 

의. 내 질문은 어떻게 내부 배열 (문자열) realloc 수 및 outher 배열 (문자열 배열) realloc 수

답변

7

"내부 배열"을 다시 할당 할 필요가 없습니다. 할당하는 메모리의 내용은 포인터이며, input을 재 할당하면 input이 가리키는 내용이 아닌 input 포인터 만 재 할당됩니다. 그것이 어떻게 작동하는지


원유 ASCII 이미지

을 표시합니다 : 당신이 재 할당 후

  +----------+ +---------------------------+ 
input -> | input[0] | -> | What `input[0]` points to | 
     +----------+ +---------------------------+ 

: 당신이 input 배열의 단일 항목을 할당 할 때 처음에는 다음과 같습니다

두 번째 입력 (즉, input = realloc(input, 2 * sizeof(char*));)

  +----------+ +---------------------------+ 
input -> | input[0] | -> | What `input[0]` points to | 
     +----------+ +---------------------------+ 
     | input[1] | -> | What `input[1]` points to | 
     +----------+ +---------------------------+ 

내용 (예 : input[0])은 재 할당 전과 동일합니다. 변경되는 유일한 것은 실제 input 포인터입니다.

+0

그래서 내가 "input = (char **) realloc (input, previousSize + 1)"과 같은 것을 할 수 있다는 것을 의미합니까? –

+0

@NickStov 맞습니다. –

+1

중요한 시스템을위한 @NickStov 당신은'realloc()'이 실패 할 경우 원래의'input' 포인터에 어떤 일이 일어나는지 생각해 볼 수 있습니다. 그러나 여기에 귀하의 구체적인 목적을 위해, 나는 당신에게 그다지 중요하지 않습니다. 또한'realloc()'은 초기 NULL 값을 넘겨 주면'malloc()'처럼 동작 할 것이므로'input' 값에'malloc()'이 필요하지 않으므로'input'이 NULL인지 확인하십시오 이 모든 일이 시작될 때. (그리고이 대답에 +1, 나는 ascii art = P를 아주 좋아한다). – WhozCraig

1

char** (즉, char에 대한 포인터 포인터)는 일부 메모리를 가리키는 포인터 배열입니다. 그래서뿐만 아니라 당신이 char* 포인터의 무리 메모리를 할당 할 필요가 있지만, 이러한 포인터의 각 (일부 문자가 저장 될 메모리)를 가리 킵니다하는 메모리 할당 할 필요가 :

const int ARR_SIZE = 10; 
const int STR_SIZE = 20; 

char** strArr = malloc(ARR_SIZE * sizeof(char*)); 
for (int i = 0; i < ARR_SIZE; ++i) 
    strArr[i] = malloc(STR_SIZE * sizeof(char)); 

strArr[9] = "Hello"; 

strArr = realloc(strArr, (ARR_SIZE + 5) * sizeof(char*)); 
for (int i = 0; i < 5; ++i) 
    strArr[ARR_SIZE + i] = malloc(STR_SIZE * sizeof(char)); 

strArr[14] = "world!"; 

printf("%s %s", strArr[9], strArr[14]); 

전체 예 here입니다. 희망이 도움 :

관련 문제