尝试将值分配给动态分配的2D阵列时,程序崩溃

时间:2014-04-30 23:07:08

标签: c arrays malloc 2d

我正在尝试为我的C编程课程中的最终项目编程,但我遇到了一个我无法弄清楚的问题。我的代码是:

#include <stdio.h>
#include <stdlib.h>
char** allocateLevel(int sizeOfLevel);

int main(void)
{

    char** level = allocateLevel(10);
    int one, two;

    for(one = 0 ; one < 10 ; one++)
    {
        for(two = 0 ; two < 10 ; two++)
        {
            level[one][two]='T'; //Crashes right here

        }
    }
    printf("%c", level[4][5]); //tests to see if it prints
}

char** allocateLevel(int sizeOfLevel)
{
    char **levelPointer;
    levelPointer = (char **)malloc(sizeOfLevel * sizeof(char **));
    int count = 0;


    for(count = 0 ; count < sizeOfLevel ; count++)
    {
        levelPointer[count] = (char*) malloc(sizeOfLevel * sizeof(char*));

    }
}

程序分配内存很好,但是当我尝试为其中一个元素赋值时它会崩溃。我无法弄清楚出了什么问题,我的教授没有多大帮助。有什么不对吗?

2 个答案:

答案 0 :(得分:2)

在您的函数allocateLevel中,您不会返回任何内容。因此,最终定义为level的值几乎未定义。

  1. 在函数return levelPointer;的末尾添加allocateLevel
  2. 启用您的编译器警告。这会告诉你&#34;功能结束而没有&#39;返回&#39;。&#34;
  3. (编辑)以及@Oli所说的 - 你的sizeof都是间接的。{/ p>

答案 1 :(得分:0)

在行中:

levelPointer = (char **)malloc(sizeOfLevel * sizeof(char **));  

我可以看到两个问题:
1) 您已投放malloc() Good discussion Here 的回报率 2) sizeof(char **);正在寻址依赖(== 8(64位),== 4(32位)。可能不是您预期的结果?)

sizeof运算符计算变量或类型的字节数。您的用法是为您提供您不期望的结果:运行此示例:

int main()
{
   cout << "Size of char ** : " << sizeof(char **) << endl;
   cout << "Size of char : " << sizeof(char) << endl;
   cout << "Size of int : " << sizeof(int) << endl;
   cout << "Size of short int : " << sizeof(short int) << endl;
   cout << "Size of long int : " << sizeof(long int) << endl;
   cout << "Size of float : " << sizeof(float) << endl;
   cout << "Size of double : " << sizeof(double) << endl;
   cout << "Size of wchar_t : " << sizeof(wchar_t) << endl;
   return 0;
}  

通常在为char **分配内存时,用法是创建一个字符串数组(又是char的数组)。因为你正在为char **分配内存看看这个作为分配内存的替代方案。它提供大小参数,并返回指针,其中包含按其他参数分配的内存。

用于创建记忆

char ** allocMemory(char ** a, int numStrings, int maxStrLen)
{
    int i;
    a = calloc(sizeof(char*)*(numStrings+1), sizeof(char*));
    for(i=0;i<numStrings; i++)
    {
      a[i] = calloc(sizeof(char)*maxStrLen + 1, sizeof(char));
    }
    return a;
}  

用于释放 完成时分配的内存。

void freeMemory(char ** a, int numStrings)
{
    int i;
    for(i=0;i<numStrings; i++)
        if(a[i]) free(a[i]);
    free(a);
}