-1

我使用malloc. 当我使用printf在 for 循环中打印数组元素时,一切都很好。但是当我想printf在 main 中使用时,这些是Segmentation fault: 11.

你能告诉我下面的代码有什么问题吗?

#include <stdlib.h>
#include <stdio.h>

void initCache(int **cache, int s, int E){
int i, j;
/* allocate memory to cache */
cache = (int **)malloc(s * sizeof(int *)); //set 
for (i = 0; i < s; i++){
    cache[i] = (int *)malloc(E * sizeof(int)); //int

    for(j = 0; j < E; j++){
        cache[i][j]  = i + j;   
        printf("%d\n", cache[i][j]);
    }
  }
}


main()
{
    int **c;

    initCache (c, 2, 2);

    printf("%d\n", c[1][1]);  // <<<<<<<<<< here

}
4

3 回答 3

4

由于您的缓存是二维数组,因此它是int**. 要将其设置在函数中,请传递int***,而不是int**。否则,对cache内部所做的更改对frominitCache的值没有影响。cmain()

void initCache(int ***cache, int s, int E) {
    int i, j;
    /* allocate memory to cache */
    *cache = (int **)malloc(s * sizeof(int *)); //set 
    for (i = 0; i < s; i++) {
        (*cache)[i] = (int *)malloc(E * sizeof(int)); //int
        for(j = 0; j < E; j++){
            (*cache)[i][j]  = i + j;   
            printf("%d\n", (*cache)[i][j]);
        }
    }
}

现在你可以这样称呼它:

initCache (&c, 2, 2);
于 2013-10-06T11:12:07.837 回答
3

您更改了一个局部变量,这不会影响cmain 中的局部变量。

如果要在函数中分配,为什么要传递变量?从函数中返回它。

int **c = initCache(2, 2);
于 2013-10-06T11:13:33.740 回答
1

您可以使用 a return,或者按照其他人的***建议使用 a 。我将在return这里描述方法。

initCache正在创建和初始化一个合适的数组,但它没有返回它。 cache是指向数据的局部变量。有两种方法可以将此信息提供给调用函数。要么return它,要么传入一个int***并使用它来记录指针值。

我建议这样做:

int** initCache(int **cache, int s, int E){
   ....
   return cache;
}


main()
{
   int **c;
   c = initCache (2, 2);
   printf("%d\n", c[1][1]);   <<<<<<<<<< here
}

====

最后,养成检查错误的习惯非常重要。例如,如果内存不足,malloc将返回。NULL此外,您可能会不小心将内存量设为负数(如果s为负数)。因此我会这样做:

cache = (int **)malloc(s * sizeof(int *));
assert(cache);

如果 malloc 失败,这将结束程序,并告诉你哪一行失败了。有些人(包括我!)会稍微不赞成assert这样使用。但是我们都同意这比没有任何错误检查要好!

您可能需要完成#include <assert.h>这项工作。

于 2013-10-06T11:13:55.947 回答