【问题标题】:First element in a double pointer to struct is jiberrish指向结构的双指针中的第一个元素是 jiberrish
【发布时间】:2019-08-02 12:53:07
【问题描述】:

我正在用 C 语言创建一个简单的结构数组,但第一个结构总是乱码。我该如何解决这个问题?

我尝试过以多种方式将双指针的第一个元素设置为 struct,但总是失败。

这是我的 graph.h 文件:


#ifndef GRAPH_H
#define GRAPH_H

#include "set.h"

typedef struct urlNode * URLList;
typedef struct GraphRep * Graph;

struct urlNode {
    int id;
    char* URL_NAME;
    URLList       next; // link to next node
};

struct GraphRep {
    int nV;
    URLList * collections;
};

Graph newGraph(Set s);
int nameToId(Graph g, char *name);
void showGraph(Graph g);

#endif


而我的 newGraph(Set s) 函数如下所示:

Graph newGraph(Set s){

    int size = nElems(s);
    Graph new_graph = malloc(sizeof(struct GraphRep));
    if (new_graph == NULL) {
        printf("ERROR: COULDNT ALLOCATE GRAPH\n");
    }

    new_graph->nV = size;
    char *name = getNextVal(s);


    // THIS IS THE NODE TO BE ADDED TO THE GRAPH
    URLList list_to_add = malloc(sizeof(struct urlNode));
    list_to_add->URL_NAME = strdup(name);
    list_to_add->id = 0;
    list_to_add->next = NULL;


    // HERE I ADD THE NODE TO THE GRAPH.
    new_graph->collections[0] = list_to_add;

    // PRINT OUT THE VALUES OF THE NEWLY ADDED NODE TO MAKE SURE IT WORKS
    // THE URL_NAME IS PRINTED OUT FINE 
    // BUT THE ID IS JIBBERISH.
    printf("%s\n", new_graph->collections[0]->URL_NAME);
    printf("%d\n", new_graph->collections[0]->id);
    if(new_graph->collections[0]->next != NULL) {
        printf("%s\n", new_graph->collections[0]->next->URL_NAME);
        printf("%d\n", new_graph->collections[0]->next->id);            
    }
    printf("\n");

    return new_graph;
}

我希望 new_graph->collections[0]->id 为 0,但它不断给我随机整数。 此外,即使新声明的指向 struct 的指针的下一个是 NULL,它仍然给我一个乱七八糟的下一个值。 任何帮助将不胜感激,谢谢!

【问题讨论】:

  • @Emalp 指针集合未初始化。
  • 您正在将 new_graph->collection[0]->id 设置为一个指针 (list_to_add),这可能不是您想要的。我不清楚你想做什么。也许您想将其设置为 list_to_add->id?

标签: c pointers memory-management struct


【解决方案1】:

对象*new_graph的数据成员collections未初始化。

只有这个数据成员被初始化

new_graph->nV = size;

所以这个说法

new_graph->collections[0] = list_to_add;

导致未定义的行为。

如果您需要URLList 类型的指针数组,您必须分配内存并将其地址分配给指针collections

例如

new_graph->collections = malloc( new_graph->nV * sizeof( URLList ) );

然后是这个声明

new_graph->collections[0] = list_to_add;

可能是有效的。

(我认为数据成员nV对应于动态分配的数组中的元素数量,尽管这可能不是真的)

注意,指针name指向的字符串在函数中没有改变,最好声明成这样

const char *name = getNextVal(s);

【讨论】:

  • 你说我会怎么初始化这个? new_graph->collections 是一个动态数组,这就是为什么它是一个指向原始结构的双指针。只有第一个索引 0 给出了 jibberish id,如果我要添加更多元素作为 new_graph->collections[1] = another_list_to_add 那么它可以工作。
  • @Emalp 动态数组在哪里?数组的内存分配在哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 2017-01-04
  • 2020-11-15
  • 2016-03-03
  • 2015-09-11
相关资源
最近更新 更多