Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-访问头文件中的指针时出现分段错误_C_Pointers_Header_Dynamic Allocation - Fatal编程技术网

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

C-访问头文件中的指针时出现分段错误,c,pointers,header,dynamic-allocation,C,Pointers,Header,Dynamic Allocation,我用C语言编程,有两个文件,func2.h: 和main.c: num_venties[]给出了正确的数字10,但当尝试访问任何静脉元素时,它给出了分段错误。如何在main.c中使用func2.h中填充的静脉的值?我做错了什么?为什么会这样 编辑: 这些代码是较大代码的简化版本。在答案中有一种解决问题的方法,但这并不是我想要的。我需要做的是在func2.h中进行动态分配,所以在调用network_construction之前,我不希望在main.c中进行任何涉及venles[][]的计算;这是你

我用C语言编程,有两个文件,func2.h:

和main.c:

num_venties[]给出了正确的数字10,但当尝试访问任何静脉元素时,它给出了分段错误。如何在main.c中使用func2.h中填充的静脉的值?我做错了什么?为什么会这样

编辑:

这些代码是较大代码的简化版本。在答案中有一种解决问题的方法,但这并不是我想要的。我需要做的是在func2.h中进行动态分配,所以在调用network_construction之前,我不希望在main.c中进行任何涉及venles[][]的计算;这是你的问题。 你实际上需要一个int***来做你想做的事。 在网络_构造中,参数veils实际上是main中变量veils的副本。因此,当您对其进行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***

您的函数调用应该如下所示:

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;
    }
 #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;
}
网络结构和矿脉,矿脉数量

然后在功能网络中,按如下所示进行构建:

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;
    }
 #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;
}

你的malloc在网络构建中的作用就是问题所在。要克服这一问题很容易,可以按如下方式修改函数:

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;
    }
 #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;
}
您的职能应如下所示:

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;
    }
 #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;
}
您的主要功能如下:

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;
    }
 #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;
}

下面的代码实现了我想要的:

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;}

你可以先把函数定义放在.c文件中…然后可能是重复的,@SouravGhosh,我这样做了,然后呢?谢谢@rajasekar25。根据您的建议,它给出了错误func2.h:15:76:警告:赋值从整数生成指针,而不使用强制转换[默认情况下启用]。第15行是我将值-1分配给我的静脉[I][j]元素的地方。我该怎么办?你必须把它用作*静脉[I][j]。此外,如果在任何地方出现静脉,您需要在此之前添加一个*解引用。再次感谢,现在使用*静脉[i][j]程序进行编译,但运行时会出现分段错误。我是使用指针的新手,所以我不确定addone*redeference意味着什么。我是否必须在每次考试前都加*号?因为我试过了,但它仍然给出了分段错误。我修改了答案,寻找新的答案。在头文件中使用函数定义也是不好的样式。尝试为函数定义创建单独的and文件谢谢,这确实解决了问题。事实上,我已经考虑过了。然而,这些张贴的代码是一个更大代码的简化版本。在func2.h中,我做了更多的工作来获得num_-venles[I],它不是常量条目。因此,我非常希望在func2.h中包含所有的计算,并在main.c中直接使用venides[]],而不需要在调用network_construction之前进行涉及venides[]]的不必要的计算。你知道怎么处理吗?我很感谢你的帮助,@Cantfindname,但是根据你给我的信息,我还不能解决这个问题。我编辑了这个问题以澄清我想要什么。你能看看它和其他的评论/答案,看看你是否能想出解决问题的办法吗?非常感谢。