2013-02-22 5 views
4

Итак, у меня странное задание. Я должен прочитать содержимое файла для строки массива. Тем не менее, я должен инициализировать массив, как это (я должен инициализировать его как размер массива 1):Как перекрыть внутренний и внешний массив

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

вместо

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

Итак, я должен продолжать использовать перераспределить. Мой вопрос в том, как я могу перераспределить внутренний массив (строку) и как я могу перераспределить массив outher (массив строк).

ответ

7

Вам не нужно перераспределять «внутренние массивы». Содержимое выделенной памяти является указателем, а когда вы перераспределяете input, тогда вы перераспределяете указатель input, а не содержимое, на которое указывает input.


Сырую ASCII-изображение, чтобы показать, как это работает:

На первом, когда вы выделяете одну запись в input массива, это выглядит следующим образом:

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

После перераспределить (т.е. 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 для критических систем, вы можете подумать о том, что происходит с исходным указателем 'input', если этот' realloc() 'всегда терпит неудачу. Однако, для вашей конкретной цели здесь, я сомневаюсь, что это очень важно для вас. Кроме того, вам не нужно 'malloc()' для вашего начального значения 'input', так как' realloc() 'будет вести себя как' malloc() ', если вы передадите ему начальное значение NULL, поэтому просто убедитесь, что' 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. Надеюсь, это поможет :)

Смежные вопросы