我有一个问题问你!
我有一个 C 程序,其中我的主函数中有一个动态二维数组:
int **neighbours;
我根据命令行中的 args 进行初始化。问题是我想稍微清理一下代码。为此,我想在头文件中创建一个函数,该函数将未初始化的数组作为参考参数并在那里对其进行初始化。
这就是我调用函数的方式:
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;
}
在此先感谢您的帮助!