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

时间:2013-05-17 02:47:30

标签: c malloc multidimensional-array

我使用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'?

谢谢。

2 个答案:

答案 0 :(得分:3)

第一个malloc的参数不适合您的2d阵列。

将其修复如下

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

答案 1 :(得分:1)

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

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

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

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

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

相关问题