2d动态数组程序崩溃

时间:2014-11-29 19:35:55

标签: c++ c arrays malloc

我写了一个动态分配的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语句来捕获这种情况。

我不确定为什么会这样做,内存的分配看起来很好,但我不是专家。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

更改为

char **arr = (char **)malloc(row * sizeof(char *));
for(i=0; i<row; i++)
   arr[i] = (char *)malloc(column * sizeof(char));

答案 1 :(得分:0)

我注意到用c ++标记标记的问题,在c ++中执行此操作的明确方法是使用std::vector。所以我回答这个问题好像是一个C问题:

看起来你还没有在这里分配足够的空间。

column = 5;
char **arr = (char **)malloc(column * sizeof(char *));

这为5个指向行的空间提供了空间。然后在循环时:

for(i=0; i<keysize; i++)//note keysize is 10
{
    for(j=0; j<size; j++){ // note size is 7
        arr[count2][count];
        count++;
        if(count == 5){
            count = 0;
            count2++;//gets incremented every time the inner loop runs
        }
    }
}

因为count2每次内循环运行时都会递增,所以最终会变得keysize。这意味着arr[keysize][0]必须有效,但这并不是因为您实际上已arr[5][14]。第一个失败是当你调用arr [6] [0]时,它会访问数组末尾并导致程序崩溃。

如果这里的目的是初始化变量,那么为了解决这个问题,您可能希望循环使用用于分配内存的维度的相同值。