2

我有一个问题问你!

我有一个 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;

}

在此先感谢您的帮助!

4

2 回答 2

1

问题是它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.

于 2012-06-25T22:02:35.743 回答
0

在示例代码中,您给出了一个错误:

neighbours[i] = malloc(*nodeNum*sizeof(int *));

它应该在哪里

neighbours[i] = malloc(*nodeNum*sizeof(int));

为什么要使用 2D 数组的仿真而不是真实的?这从 C99 开始有效:

int (*neighbours)[nodeNum] = malloc(sizeof(int[nodeNum][nodeNum]));

您将不需要init像您这样仅分配内存的设备。

为什么要直接传递指向nodeNum而不是值的指针?如果您仍然需要一个init进行一些初始化而不仅仅是分配的函数。界面看起来像

void init(size_t nodeNum, int neighbours[nodeNum][nodeNum]);
于 2012-06-25T22:42:10.893 回答