繁体   English   中英

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

[英]Assigning values to 2D array created using malloc

我使用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的参数不适合您的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个字节,但又分配给程序另一部分所拥有的另外1个字节。 当您将此内存地址设置为空字符串时,程序的其他部分可能会更改指针的最后一个字节,然后再将数据打印到其指向的内存位置,从而将您发送到您的其他内存位置打印声明。

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

要永久修复它,请执行vvy建议的操作(除非不要转换malloc)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM