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

时间:2015-08-29 03:43:13

标签: c matrix malloc memset

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

#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?

2 个答案:

答案 0 :(得分:3)

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

#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方法中定义了ilhas)并且你将它的地址发送给了一个方法(通过引用调用) )假设从堆栈段而不是堆中为它分配内存,如果将简单类型变量的地址传递给方法,它就会出问题,但为数组分配内存会引起分段问题。

答案 1 :(得分:2)

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

您要执行的操作是从ilhas中移除cria_ilhas参数,并在main中调用时停止传递该参数。然后,只需将ilhas声明为cria_ilhas中的局部变量。要将值恢复为main,您需要从cria_ilhas返回,并在main中,当您调用它时,将ilhas分配给其结果。

1 附注:如果您使用的是C ++,则可以通过将参数从int **ilhas更改为int **&ilhas来使其正常工作。