gpt4 book ai didi

c - 二维动态数组未初始化 - 函数 C 的参数

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:30 25 4
gpt4 key购买 nike

我有一个问题要问你!

我有一个 C 程序,其中我的主要函数中有一个动态二维数组:

int **neighbours;

我根据命令行中的参数进行初始化。问题是我想稍微清理一下代码。为此,我想在头文件中创建一个函数,该函数将未初始化的数组作为引用参数并在那里对其进行初始化。

我是这样调用函数的:

init(&nodeNum, &neighbours, argv[1], &nodes);

这是我在头文件中声明函数的方式:

int init(int *nodeNum, int ***neighbours, char *arg, struct node **nodes)

这是尝试分配内存的方式:

neighbours=malloc(*nodeNum*sizeof(int *));
for(i=0;i<*nodeNum;i++){
neighbours[i] = malloc(*nodeNum*sizeof(int *));
}

很明显,有些事情进展不顺利,它崩溃了!关于我可能做错了什么的任何提示?

感谢一些好心人的帮助,malloc 现在可以工作了,但是填充节点失败了!

函数的完整代码如下:

int init(int *nodeNum, int ***neighbours, char *arg, struct node **nodes){
FILE *file;
char buffer[4];
int i,y,distance;

if(strcmp(arg,"-l")==0){
file = fopen("C:\\Users\\trendkiller\\thesis\\matrix.txt","r");
printf("parsing adjacency matrix from file\n\n");
//file = fopen ("C:\\Users\\trendkiller\\thesis\\matrix.txt", "r" ) ;
*nodeNum = atoi(fgets(buffer,4,file));
*neighbours=malloc(*nodeNum*sizeof(int *));
for(i=0;i<*nodeNum;i++){
(*neighbours)[i] = malloc(*nodeNum*sizeof(int *));
}
printf("this prints\n");
printf("number of nodes: %s", buffer);
for(i=0;i<*nodeNum;i++){
for(y=0;y<*nodeNum;y++){
fgets(buffer,4,file);
(*neighbours)[i][y]=atoi(buffer);
}
}


}
else{
*nodeNum = atoi(arg);

*neighbours=malloc(*nodeNum*sizeof(int *));
printf("this prints\n");
for(i=0;i<*nodeNum;i++){
(*neighbours)[i] = malloc(*nodeNum*sizeof(int *));
}

*nodes=malloc(*nodeNum*sizeof(struct node));

for(i=0;i<30;i++){
(*nodes)[i].x=rand()%100;
(*nodes)[i].y=rand()%100;
}
printf("this prints\n");

printf("creating new adjacency matrix\n\n");
for(i=0; i<*nodeNum; i++){
for(y=0; y<*nodeNum; y++){
distance=sqrt((((*nodes)[y].x-(*nodes)[i].x)*((*nodes)[y].x-(*nodes)[i].x))+(((*nodes)[y].y-(*nodes)[i].y)*((*nodes)[y].y-(*nodes)[i].y)));
if(i==y){
(*neighbours)[i][y]=-1;
}
else if(distance<=20){
(*neighbours)[i][y]=1;
}
else {
(*neighbours)[i][y]=0;
}
}

}

file = fopen("C:\\Users\\trendkiller\\thesis\\matrix.txt","a+");
fprintf(file,"%d\n",*nodeNum);
for(i=0;i<*nodeNum;i++){
for(y=0;y<*nodeNum;y++){
fprintf(file,"%d\n", (*neighbours)[i][y]);
}
}
}

返回0;

预先感谢您的帮助!

最佳答案

问题是 neighbours 是按值传递的,因此在函数内部对其进行修改无效。您需要通过指针传递它,并间接修改它:

int init(int *nodeNum, int ***neighbours_ptr, char *arg, struct node *nodes) {
*neighbours_ptr = malloc(*nodeNum*sizeof(int *));
for(i=0;i<*nodeNum;i++){
(*neighbours_ptr)[i] = malloc(*nodeNum*sizeof(int *));
}
}

您还需要传递 &neighbours 而不是 neighbours 作为 init 的第二个参数。

关于c - 二维动态数组未初始化 - 函数 C 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11197914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com