C语言 为使用malloc创建的2D数组赋值



我使用malloc创建了一个2D字符数组,并一直试图将其值分配给''。

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] = '';
}
然而,当我打印输出时,我得到:
predicate_array[0] = (P;
predicate_array[1] = 
predicate_array[2] = 
predicate_array[3] = 
predicate_array[4] = 
predicate_array[5] = 
predicate_array[6] = 
...
...

有人知道为什么第一个数组没有被设置为''吗?

谢谢。

第一个malloc的参数不适合你的2d数组。

修复如下

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

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

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

要测试这一点,将no_of_lines_in_data_map设置为8或更大(不修复任何其他内容),并查看第一个输出位是否正确(但程序仍然存在问题,您应该期望它崩溃或在其他地方提供错误数据)。

要永久修复它,请按照我的建议去做(除了不要强制转换malloc)。

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

相关内容

  • 没有找到相关文章

最新更新