0

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

谢谢你。

4

2 回答 2

3

第一个 malloc 的参数不适合您的二维数组。

修复如下

char **predicate_array = (char **)malloc(no_of_lines_in_data_map*sizeof(char *));
于 2013-05-17T03:06:34.040 回答
1

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

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

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

要永久修复它,请执行 vvy 建议的操作(除了不要强制使用 malloc)。

另外,我的书呆子想说你并没有真正分配二维数组,因为内存不是连续的。您实际上是在分配一个指向数组列表的数组,但它们分布在各处。

于 2013-05-17T03:52:01.887 回答