为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 方法中没有定义)并且你将它的地址发送给了一个方法(调用通过引用)假设从堆栈段而不是堆为其分配内存,如果将简单类型变量的地址传递给方法,这不会成为问题但是为数组分配内存会引发分段问题。
我正在尝试为函数中的矩阵分配内存,然后打印其值。
#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 方法中没有定义)并且你将它的地址发送给了一个方法(调用通过引用)假设从堆栈段而不是堆为其分配内存,如果将简单类型变量的地址传递给方法,这不会成为问题但是为数组分配内存会引发分段问题。