我正在尝试将内存分配给函数中的矩阵,然后打印其值。
#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?
答案 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
来使其正常工作。