将值分配给使用malloc创建的2D数组

我使用malloc创建了一个2D字符数组,并一直试图将其值赋给’\ 0’。

char **predicate_array = malloc(no_of_lines_in_data_map); for(int i = 0; i < no_of_lines_in_data_map; i++){ predicate_array[i] = malloc(1024 * sizeof(char)); predicate_array[i][0] = '\0'; } 

但是,当我打印输出时,我得到:

 predicate_array[0] = (P; predicate_array[1] = predicate_array[2] = predicate_array[3] = predicate_array[4] = predicate_array[5] = predicate_array[6] = ... ... 

有谁知道为什么第一个数组没有被设置为’\ 0’?

谢谢。

第一个malloc的参数不适合您的2Darrays。

修复如下

 char **predicate_array = (char **)malloc(no_of_lines_in_data_map*sizeof(char *)); 

这是我唯一可以冒险的猜测。 如果你的no_of_lines_in_data_map设置为7,我根据你显示的输出进行猜测,并且你在64位平台上使用8字节指针,你甚至没有为单个指针分配足够的空间。 您分配了7个字节,而不是7 *大小的指针字节。

当您尝试分配第一个malloc时,您的程序可能会崩溃,但它不一定要取决于您的系统以及该内存是否分配给您的进程。 因此,当您使用malloc并将结果指针分配给数组的第一个元素时,您将分配给您期望的7个字节,但是另外一个字节由程序的另一部分拥有。 当您将此内存地址设置为空字符串时,在您指向的内存位置打印数据之前,程序的某些其他部分可能正在更改指针的最后一个字节,从而将您发送到不同的内存位置打印声明。

要对此进行测试,请将no_of_lines_in_data_map设置为8或更高(不修复任何其他内容)并查看输出的第一位是否正确(但程序仍然损坏,您应该预期它会崩溃或在其他地方提供错误数据)。

要永久修复它,做vvy建议的(除非不要施放你的malloc)。

另外,我的学生想要说你并没有真正分配2D数组,因为内存不是连续的。 你真的在分配一个指向数组列表的数组,但它们遍布全局。