如何重新分配内部和外部数组

时间:2013-02-22 20:02:55

标签: c string memory-management

所以,我得到了一个奇怪的任务。我必须将文件内容读取到数组字符串。但是,我必须像这样初始化数组(我必须将其初始化为数组大小1):

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

而不是

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

所以,我必须继续使用realloc。我的问题是,如何重新分配内部数组(字符串)以及如何重新分配外部数组(字符串数组)

2 个答案:

答案 0 :(得分: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指针。

答案 1 :(得分: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。希望这会有所帮助:)