C - 访问头文件中的指针时出现分段错误

时间:2014-11-05 09:50:42

标签: c pointers header dynamic-allocation

我正在使用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中涉及静脉[] []的任何计算。

4 个答案:

答案 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。您的情况相同,但请考虑intint*

,而不是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);