我正在使用C编程,并且有两个文件, func2.h :
#define NN 20
void network_construction(int **veins, int *num_veins){
int i, j;
for(i=0;i<NN;i++){
num_veins[i] = NN/2;
}
veins = malloc(NN * sizeof(*veins));
for (i = 0; i < NN; i++) { veins[i] = malloc(num_veins[i] * sizeof(*(veins[i]))); }
for (i = 0; i < NN; i++) { for (j = 0; j<num_veins[i];j++) { veins[i][j] = -1; } }
return;
}
和 main.c :
#include <stdio.h>
#include <stdlib.h>
#include "func2.h"
void main(){
int num_veins[NN];
int **veins;
network_construction(veins, num_veins);
printf("\n%d\n", num_veins[19]);
printf("\n%d\n", veins[2][2]);
return;
}
num_veins []给出正确的数字10,但是当试图访问静脉的任何元素时,它会给出分段错误。我怎样才能在main.c中使用func2.h中填充的静脉值?我做错了什么,为什么会这样?
修改
这些代码是较大代码的简化版本。答案中有一种方法可以解决问题,但这并不是我想要的。我需要的是在func2.h
中进行动态分配,因此在调用network_construction()之前,我不希望在main.c
中涉及静脉[] []的任何计算。
答案 0 :(得分:0)
veins = malloc(NN * sizeof(*veins));
是你的问题。
你实际上需要一个int***
来做你想做的事。
在network_construction
内,参数静脉实际上是veins
中变量main
的副本。因此,当您对其进行malloc时,只会更改副本,而不会更改main中的变量。
同样问题的一个更简单的例子是:
void foo(int a){
a=5;
}
void foo2(int* a){
*a=5;
}
int main(){
int a=0;
foo(a);
printf("%d\n",a);
foo2(&a);
printf("%d\n",a);
}
打印0
5
。您的情况相同,但请考虑int
和int*
int**
和int***
。
答案 1 :(得分:0)
您的函数调用应如下所示:
network_construction(&amp; veins,num_veins);
然后在函数network_construction中捕获静脉如下:
void network_construction(int ***veins, int *num_veins){
int i, j;
for(i=0;i<NN;i++){
num_veins[i] = NN/2;
}
*veins = malloc(NN * sizeof(**veins));
for (i = 0; i < NN; i++) { *veins[i] = malloc(num_veins[i] * sizeof(**(veins[i]))); }
for (i = 0; i < NN; i++) { for (j = 0; j<num_veins[i];j++) { *veins[i][j] = -1; } }
return;
}
答案 2 :(得分:0)
您在network_construction()函数中的malloc是个问题。容易克服这个问题是修改你的功能如下:
你的func.c应该如下:
#define NN 20
void network_construction(int **veins, int *num_veins){
int i, j;
for (i = 0; i < NN; i++) { for (j = 0; j<num_veins[i];j++) { veins[i][j] = -1; } }
return;
}
您的主要功能如下:
#include <stdio.h>
#include <stdlib.h>
#include "func2.h"
void main(){
int num_veins[NN];
int **veins;
int i;
for(i=0;i<NN;i++){
num_veins[i] = NN/2;
}
veins = malloc(NN * sizeof(*veins));
for (i = 0; i < NN; i++) { veins[i] = malloc(num_veins[i] * sizeof(*(veins[i]))); }
network_construction(veins, num_veins);
printf("\n%d\n", num_veins[19]);
printf("\n%d\n", veins[2][2]);
return;
}
答案 3 :(得分:0)
以下代码实现了我想要的目标:
void network_construction(int ***veins, int num_veins[]){
int i,j;
for(i=0;i<NN;i++){
num_veins[i] = NN/2;
}
(*veins) = malloc((NN) * sizeof(**veins));
for(i=0;i<NN;i++){
(*veins)[i] = malloc(num_veins[i]*sizeof(*(*veins)[i]));
}
for (i = 0; i < NN; i++) {
for (j = 0; j < num_veins[i]; j++) {
(*veins)[i][j] = -1;
}
}
return;}
在main()中调用它:
network_construction(&veins,num_veins);