为c中的矩阵分配内存的问题

Problems with allocating memory for a matrix in c

我正在尝试为函数中的矩阵分配内存,然后打印其值。

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

void cria_ilhas(int** ilhas, int n){
    int i, p;
    ilhas = (int**) malloc(n*sizeof(int*));
    for (i=0;i<n;i++){
        ilhas[i] = (int*) malloc(n*sizeof(int));
        for (p=0; p<n; p++)
            ilhas[i][p] = 4;
    }
    printf("value %d\n",ilhas[0][0]);
}

void main(){
    int n=5, i, j;
    int **ilhas;
    cria_ilhas(ilhas, n);
    for(i=0; i<n; i++){
        for(j=0;j<n;j++){
            printf("%d ",ilhas[i][j]);
        }
        printf("\n");
    }   
}

但这是输出:

value 4
Segmentation fault

为什么我有分段错误?

如何在这种矩阵中使用memset?

你做的几乎是正确的。当您调用 cria_ilhas 时,您将传入变量 ilhas,并期望当您在函数内部更改它时,这也会影响 main 中的变量。不幸的是,C 不是这样工作的。1

您要做的是从 cria_ilhas 中删除 ilhas 参数,并在 main 中调用它时停止传递它。然后只需将ilhas声明为cria_ilhas中的局部变量即可。要将值返回给 main,您需要从 cria_ilhas 中 return 它,并且在 main 中,当您调用它时,将 ilhas 分配给它的结果。

1 旁注:如果您使用的是 C++,则可以通过将参数从 int **ilhas 更改为 int **&ilhas.[=23 来使其工作=]

将您的代码更改为这种形状并告诉我它是否有效

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int** cria_ilhas( int n){
    int i, p;
    int **ilhas
    ilhas = (int**) malloc(n*sizeof(int*));
        for (i=0;i<n;i++){
            ilhas[i] = (int*) malloc(n*sizeof(int));
            for (p=0; p<n; p++)
                ilhas[i][p] = 4;
         }
    printf("value %d\n",ilhas[0][0]);
    return ilhas;
}
void main(){
    int n=5, i, j;
    int **ilhas;
    ilhas = cria_ilhas(n);
    for(i=0; i<n; i++){
        for(j=0;j<n;j++){
            printf("%d ",ilhas[i][j]);
        }
        printf("\n");
    }   
}

我认为它应该适合你,你的代码很可能是真的,但问题是你在堆中定义了一个大结构(在 main 方法中没有定义)并且你将它的地址发送给了一个方法(调用通过引用)假设从堆栈段而不是堆为其分配内存,如果将简单类型变量的地址传递给方法,这不会成为问题但是为数组分配内存会引发分段问题。