在C中,calloc退出程序

juud5qan  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(124)

所以,我是C的新手。我试图为2D数组分配内存。每当它到达calloc时,它就会退出程序。我试图将其更改为malloc,但这也不起作用。(此外,我是匈牙利人,所以有些文本是匈牙利语)
下面是我如何声明我的矩阵以及如何将它给予给我的函数。

int** matrix = NULL;

matrixg(size, matrix);

字符串
下面是我认为与此相关的函数部分:

void matrixg(int* size,int** matrix2){

    //Mátrix mérete
    int k = 0;
    char szamseged[11];
    printf("How big should the matrix be? Under no cicumstance, type 0. (at least 1, maximum 20):\n");
    getchar();
    fgets(szamseged, 10, stdin);
    int meret = atoi(szamseged);
    while(meret == 0){
        if(k == 1){
            printf("I can do this all day.\n");
        }
        printf("Try again dummy!\n");
        getchar();
        fgets(szamseged, 10, stdin);
        meret = atoi(szamseged);
        k++;
    }
    *size = meret;

    *matrix2 = calloc((*size), sizeof(int*));
    for (int i = 0; i < (*size); i++) {
        printf("na ez jó.");
        matrix2[i] = calloc((*size), sizeof(int));
    }

ct3nt3jp

ct3nt3jp1#

你的间接级别搞错了。假设成功了,这...

*matrix2 = calloc((*size), sizeof(int*));

字符串
.设置*matrix2,也就是matrix2[0],指向一个足够大的分配块,用于int *类型的*size对象。这依赖于*matrix2指定一个int *类型的现有对象,这可能是你的问题。但即使这样也没问题,
1.在循环中,使用不同的指针覆盖matrix2[0],从而泄漏原始分配,
1.所提供的代码中没有任何内容可以确保matrix[1]matrix[i]中的 any 指定有效对象。
最有可能的是,你想要的东西更像这样:

// Note _triple_ pointer, because you want (I assume) to assign a value to
// a double pointer belonging to the caller:
void matrixg(int* size,int*** matrix2){
    // ...

    *size = meret;

    int **temp = calloc((*size), sizeof(*temp));
    // alternatively:
    // int **temp = calloc((*size), sizeof(int *));
    for (int i = 0; i < (*size); i++) {
        printf("na ez jó.");
        temp[i] = calloc((*size), sizeof(*temp[i]));
        // alternatively:
        // temp[i] = calloc((*size), sizeof(int));
    }

    *matrix2 = temp;

    // ...
}


你可以这样称呼它:

int size;
    int **matrix;
    matrixg(&size, &matrix);


为了清楚起见,这确实省略了对分配成功的任何检查。但是,为了健壮性,您绝对应该验证每个分配是否成功,并在其中任何一个失败时采取适当的操作-可能是诊断消息和干净的关闭。

相关问题