Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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
另一个malloc/free困境 我在6年内还没有使用C或C++,有点生疏了。我正在为图形遍历算法编写一些快速测试代码。该代码接受邻接列表样式输入。但是,我在使用免费/malloc时遇到了一些问题_C_Pointers_Malloc_Free - Fatal编程技术网

另一个malloc/free困境 我在6年内还没有使用C或C++,有点生疏了。我正在为图形遍历算法编写一些快速测试代码。该代码接受邻接列表样式输入。但是,我在使用免费/malloc时遇到了一些问题

另一个malloc/free困境 我在6年内还没有使用C或C++,有点生疏了。我正在为图形遍历算法编写一些快速测试代码。该代码接受邻接列表样式输入。但是,我在使用免费/malloc时遇到了一些问题,c,pointers,malloc,free,C,Pointers,Malloc,Free,我的代码有两个问题: 当我在没有free和getchar的情况下运行代码时,当我使用VC++cntrl-f5时,代码将挂起。当我使用getchar()时,这一问题得到了解决。有人知道为什么吗 当我在空闲状态下运行代码时,代码挂起。我试着调试代码,但它正好挂在free语句上。关于如何解决这个问题,有什么建议吗 另外,如果我使用此代码做了任何危险的事情,请告诉我。头文件被省略 void * s_malloc(size_t size){ void * ret_pntr = malloc(s

我的代码有两个问题:

  • 当我在没有
    free
    getchar
    的情况下运行代码时,当我使用VC++cntrl-f5时,代码将挂起。当我使用
    getchar()
    时,这一问题得到了解决。有人知道为什么吗

  • 当我在空闲状态下运行代码时,代码挂起。我试着调试代码,但它正好挂在
    free
    语句上。关于如何解决这个问题,有什么建议吗

  • 另外,如果我使用此代码做了任何危险的事情,请告诉我。头文件被省略

      void * s_malloc(size_t size){
        void * ret_pntr = malloc(sizeof(size));
        if (ret_pntr == NULL){
            printf ("error");
            exit(1);
        }
        return (void *)malloc(sizeof(size));
      }
    
      void initialize_graph(graph * G1, int num_vertices){
        int i = 0 ;
        G1->num_vertices = num_vertices;
        G1->node_list = (node**)s_malloc(sizeof(node*)*num_vertices);
        for (i = 0; i < num_vertices; i ++){
            G1->node_list[i] = (node *)s_malloc(sizeof(node));
        }
      }
    
      void free_everything(graph * G1){
        int i = 0;
        node * ref = NULL;
        for (i = 0; i < G1->num_vertices; i++){
            ref = G1->node_list[i];
            recursive_remove(ref);
        }
        free(G1->node_list);
      }
    
      void recursive_remove(node * ref){
        if (ref == NULL){
            return;
        }
        else{
            recursive_remove(ref->next);
        }
        free(ref);
      }
    
      int main(){
        int i = 0;
        graph * G1 = (graph*)s_malloc(sizeof(graph));
        G1->init = &initialize_graph;
        G1->init(G1, 10);
        G1->remove = &free_everything;
        G1->node_list[0]->value = 1;
        G1->node_list[0]->next = (node*)s_malloc(sizeof(node));
        G1->node_list[0]->next->value = 2;
        G1->node_list[0]->next->next = NULL;
        G1->node_list[1]->value = 10;
        printf("%d\n", G1->node_list[0]->next->value);
        printf("%d\n", G1->node_list[1]->value);
        G1->remove(G1);
        free(G1);
        getchar();
       }
    
    void*s\u malloc(大小){
    void*ret_pntr=malloc(sizeof(size));
    如果(ret_pntr==NULL){
    printf(“错误”);
    出口(1);
    }
    返回(void*)malloc(sizeof(size));
    }
    无效初始化图(图*G1,整数个顶点){
    int i=0;
    G1->num_顶点=num_顶点;
    G1->node_list=(node**)s_malloc(sizeof(node*)*num_顶点);
    对于(i=0;inode_list[i]=(node*)s_malloc(sizeof(node));
    }
    }
    无任何内容无效(图*G1){
    int i=0;
    节点*ref=NULL;
    对于(i=0;inum_顶点;i++){
    ref=G1->node_list[i];
    递归删除(ref);
    }
    自由(G1->节点列表);
    }
    无效递归删除(节点*ref){
    如果(ref==NULL){
    返回;
    }
    否则{
    递归删除(参考->下一步);
    }
    免费(参考);
    }
    int main(){
    int i=0;
    图*G1=(图*)s_malloc(图的大小);
    G1->init=&初始化图;
    G1->init(G1,10);
    G1->remove=&释放所有内容;
    G1->节点列表[0]->值=1;
    G1->node_list[0]->next=(node*)s_malloc(sizeof(node));
    G1->node_list[0]->next->value=2;
    G1->node_list[0]->next->next=NULL;
    G1->节点列表[1]->值=10;
    printf(“%d\n”,G1->node\u list[0]->next->value);
    printf(“%d\n”,G1->node\u list[1]->值);
    G1->移除(G1);
    自由(G1);
    getchar();
    }
    
    一件立即跳出来的事情是

    void * s_malloc(size_t size){
      void * ret_pntr = malloc(sizeof(size));
      if (ret_pntr == NULL){
        printf ("error");
        exit(1);
      }
      return (void *)malloc(sizeof(size));
    }
    
    您分配了两次,泄漏了第一次分配,并且没有检查第二次分配的结果。另一个是您的
    malloc
    调用应该是

     malloc(size)
    
    不是

    因为在您当前的代码中,您未充分分配所有内存(每次分配一次只能给您4个字节),所以您的访问会到处乱跑。。。我很惊讶执行过程居然进入了
    getchar()
    free()

    现在还不清楚的是,为什么在使用VC++时要尝试在C中模拟OOP。如果你用C++来重写这个,使用STL容器来保存你的节点,用索引代替指针,我想你的很多问题就会消失。但是现在,为你调试这个混乱局面对任何人来说都不是一件有趣的事


    更好的解决方案是使用现有的图形库,比如

    void * s_malloc(size_t size){
      void * ret_pntr = malloc(sizeof(size));
      if (ret_pntr == NULL){
        printf ("error");
        exit(1);
      }
      return (void *)malloc(sizeof(size));
    }
    
    您分配了两次,泄漏了第一次分配,并且没有检查第二次分配的结果。另一个是您的
    malloc
    调用应该是

     malloc(size)
    
    不是

    因为在您当前的代码中,您未充分分配所有内存(每次分配一次只能给您4个字节),所以您的访问会到处乱跑。。。我很惊讶执行过程居然进入了
    getchar()
    free()

    现在还不清楚的是,为什么在使用VC++时要尝试在C中模拟OOP。如果你用C++来重写这个,使用STL容器来保存你的节点,用索引代替指针,我想你的很多问题就会消失。但是现在,为你调试这个混乱局面对任何人来说都不是一件有趣的事


    一个更好的解决方案是使用现有的图形库,如

    您不需要检查许多其他内存分配,而在调用initialize\u graph时,您必须始终这样做。您也不需要检查许多其他内存分配,而在调用initialize\u graph时,您必须始终这样做。Super让它正常工作。我最终将把这段代码移植到一个只有c编译器的嵌入式系统中,我只想测试它,并尽可能保持它的干净。再次感谢你,超级棒,成功了。我最终将把这段代码移植到一个只有c编译器的嵌入式系统中,我只想测试它,并尽可能保持它的干净。不过再次谢谢你。