2013-02-22 40 views
4

所以,我得到了一个奇怪的任务。我必须读取文件内容到数组字符串。但是,我必须初始化这样的阵列(我必须把它作为初始化数组大小1)的如何重新分配内部和外部阵列

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

代替

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

所以,我一直在使用realloc的保持。我的问题是,我怎样才能重新分配内部数组(字符串),我怎样才能重新分配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)” – 2013-02-22 20:08:38

+0

@NickStov是的。 – 2013-02-22 20:12:01

+1

@NickStov对于关键系统,如果realloc()失败,您可能需要考虑原始“输入”指针会发生什么情况。但是,为了您在这里的具体目的,我认为您对您很重要。另外,由于realloc()的行为与malloc()类似,所以如果你传递一个初始的NULL值,你不需要'malloc()'作为初始'input'值,所以只要确保'input'是NULL当这整件事开始时。 (和这个答案+1,我爱ascii艺术= P)。 – WhozCraig 2013-02-22 20:16:19

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。希望这有助于:)