#include <stdio.h>
#include <stdlib.h>
char **Names;
int size = 2; //Minimum size for 2D array
void main() {
int i;
Names = (char **)malloc(size * sizeof(char *)); // First initaliaion of 2D array in heap
for (i = 0; i < size; i++)
Names[i] = (char *)malloc(20 * sizeof(char));
printf("nenter");
for (i = 0; i < size; i++)
scanf("%s", Names[i]);
while (1) {
size++;
Names = (char **)realloc(Names, size * sizeof(char *)); //Dynamic allocation of 2D aray
for (i = 0; i < size; i++)
Names[i] = (char *)realloc(Names[i], 20 * sizeof(char));
i = size - 1;
printf("nenter");
scanf("%s", Names[i]);
for (i = 0; i < size; i++)
printf("n%s", Names[i]);
}
}
它不会立即崩溃,这取决于";尺寸";我已初始化。它在为我分配了5个之后崩溃。我试着添加免费功能,但似乎没有帮助。
此内存重新分配后
size ++;
Names= (char**)realloc(Names,size*sizeof(char *));
指针数组的最后一个指针有一个不确定的值,因为它没有初始化。
因此,对该循环中最后一个指针的realloc
调用
for (i=0; i<size; i++)
Names[i] = (char*)realloc(Names[i],20*sizeof(char));
调用未定义的行为。
在执行循环之前,你需要初始化最后一个指针,至少像一样
Names[size-1] = NULL;
事实上,使用for循环是没有意义的,因为您需要的是为新添加的指针分配内存。由早期创建的指针指向的已分配内存的大小没有改变。
所以不是
for (i=0; i<size; i++)
Names[i] = (char*)realloc(Names[i],20*sizeof(char));
你可以写
Names[size-1] = malloc( 20 * sizeof( char ) );
请注意,如果您有一个无限循环,那么内存重新分配迟早会失败。
同样根据C标准,无参数的功能主体应像一样声明
int main( void )