【发布时间】:2015-01-28 03:35:25
【问题描述】:
我编写了一个动态分配的 2D 数组,但由于某种原因它没有按我的预期工作。 我分配了一个 14x5 数组来存储值。
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j, count, count2;
int size, keysize, column;
size = 7; keysize = 10; column = 5;
int row = (size * keysize) / column; // 14
char **arr = (char **)malloc(column * sizeof(char *));
for(i=0; i<row; i++)
arr[i] = (char *)malloc(row * sizeof(char *));
count=0;
count2=0;
for(i=0; i<keysize; i++)
{
for(j=0; j<size; j++)
{
printf("arr[%d][%d]=", count2, count);
arr[count2][count] = 'C';
printf("%c\n", arr[count2][count]);
count++;
if(count == 5)
{
count = 0;
count2++;
}
}
}
return 0;
}
在 arr[6][0] 位置插入值时,程序似乎崩溃了。 在此之前它工作正常。 我插入了一些 printf 语句来捕捉这种情况。
我不知道为什么会这样,内存分配对我来说看起来不错,但我不是专家。
感谢您的帮助。
【问题讨论】:
-
注意:请避免转换
malloc()的返回 -
arr[i] = (char *)malloc(row * sizeof(char *));。您应该分配(rows * elementsize),但目前还不清楚有多少行或每个元素的大小。 -
column = 5; malloc(column * sizeof(char *));这为 5 个指向行的指针腾出空间,然后您调用arr[6][0],这样它将访问数组末尾。 -
@SouravGhosh 他同时拥有 C 和 C++ 标签,如果他想用 C++ 编译器编译它,他需要强制转换它,C++ 不会隐式地进行任意指针类型转换。 (我知道这是不可取的,但有些人只是编写在 C++ 和 C 编译器上编译的程序)
-
@PeterT
#include <stdio.h>和malloc()不适用于C++。此外,同时标记C和c++通常被认为是标签垃圾邮件。