Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当试图为动态分配的2D数组赋值时,程序崩溃_C_Arrays_Malloc_2d - Fatal编程技术网

C 当试图为动态分配的2D数组赋值时,程序崩溃

C 当试图为动态分配的2D数组赋值时,程序崩溃,c,arrays,malloc,2d,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++

我正试图为我的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*));

    }
}
#包括
#包括
字符**分配级别(int sizeOfLevel);
内部主(空)
{
字符**级别=分配级别(10);
int一,二;
对于(一个=0;一个<10;一个++)
{
对于(两个=0;两个<10;两个++)
{
级别[1][2]='T';//就在这里崩溃
}
}
printf(“%c”,级别[4][5]);//测试是否打印
}
字符**分配级别(整数大小级别)
{
字符**levelPointer;
levelPointer=(char**)malloc(sizeOfLevel*sizeof(char**));
整数计数=0;
对于(计数=0;计数

程序很好地分配了内存,但当我试图给其中一个元素赋值时,它崩溃了。我不知道出了什么问题,我的教授也没帮上什么忙。有什么问题吗?

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

  • 添加
    返回levelPointer在函数的末尾
    allocateLevel
  • 启用编译器警告。这会告诉您“函数结束时没有‘返回’。”
  • (Ed.)还有@Oli所说的——你的
    大小都有一定程度的间接偏差

    levelPointer = (char **)malloc(sizeOfLevel * sizeof(char **));  
    
    我可以看到两个问题:
    1)您已将
    malloc()

    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;
    }  
    
    用于释放完成后分配的内存

    void freeMemory(char ** a, int numStrings)
    {
        int i;
        for(i=0;i<numStrings; i++)
            if(a[i]) free(a[i]);
        free(a);
    }
    
    void freemory(字符**a,整数字符串)
    {
    int i;
    
    对于(i=0;我查看一下您的
    sizeof
    用法。以及
    allocateLevel()
    中的
    return
    语句在哪里?它到底出了什么问题?哇,我真的很笨。这是我的return语句。谢谢。您也应该修复
    sizeof
    语句。第一个应该是
    sizeof(char*)
    ,第二个应该是
    sizeof(char)
    (或者干脆省去它,因为
    sizeof(char)
    是1)。为了避免malloc大小问题,请使用这个习惯用法,其中
    p
    是指针,
    N
    是需要多少元素:
    p=malloc(N*sizeof*p);
    void freeMemory(char ** a, int numStrings)
    {
        int i;
        for(i=0;i<numStrings; i++)
            if(a[i]) free(a[i]);
        free(a);
    }