所以,我接到了一个奇怪的任务。我必须将文件内容读取到数组字符串中。但是,我必须像这样初始化数组(我必须将其初始化为数组大小 1):
char **input = (char **)malloc(1*sizeof(char*))
代替
char **input = (char **)malloc((sizeOfFile+1)*sizeof(char*))
所以,我必须继续使用 realloc。我的问题是,如何重新分配内部数组(字符串)以及如何重新分配外部数组(字符串数组)
所以,我接到了一个奇怪的任务。我必须将文件内容读取到数组字符串中。但是,我必须像这样初始化数组(我必须将其初始化为数组大小 1):
char **input = (char **)malloc(1*sizeof(char*))
代替
char **input = (char **)malloc((sizeOfFile+1)*sizeof(char*))
所以,我必须继续使用 realloc。我的问题是,如何重新分配内部数组(字符串)以及如何重新分配外部数组(字符串数组)
您不必重新分配“内部数组”。您分配的内存内容是指针,当您重新分配时,input
您只重新分配input
指针,而不是 whereinput
指向的内容。
一个粗略的 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
指针。
你的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]);
完整的例子在这里。希望这可以帮助 :)