【问题标题】:Access values of structs from a pointer in a struct从结构中的指针访问结构的值
【发布时间】:2017-01-16 18:12:53
【问题描述】:

我会尽量保持简短。 所以我有两个结构:

typedef struct someStruct named;
struct someStruct {
    void *key;                  
    void *value;                    
};
typedef struct anotherStruct namedToo;
struct anotherStruct {
    named **table;          
    unsigned int size;          
};

好的,现在忽略上面所有可能的错误,这是不可编辑的代码。

现在我有两种方法:

namedToo *init(float ignoreThis) {
    namedToo *temp;
    temp = malloc(sizeof(namedToo)); //some memory for the second struct
    temp->table = malloc(sizeof(named)*100); //lets say this 100 is for 100 buckets/cells/named elements
    return temp;

方法二:

int insert(namedToo *temp, void* key, void* value) {
     temp->table[0]->key = key; //My problem, I need to access the value and key inside named from the pointer inside namedToo. How can I do this?
}

评论有我的问题: 我的问题,我需要从namedToo中的指针访问named中的值和键。我怎样才能做到这一点?我需要不时自己更改和获取值/键。

【问题讨论】:

  • 名称table 表明它应该被视为二维数组,而不是一维数组。是这样吗?
  • 它有可能,但不是必须的,table 的原因是因为它是一个哈希表/映射的残余。第一个结构中有一个指针,它指向另一个用于单独链接的元素,尽管我没有在这里包含它。让我们假设使用的名称是完全任意的。 @dbush
  • init 没有正确地将table 初始化为指向指针的指针。

标签: c arrays pointers struct hashmap


【解决方案1】:

声明named **table;table 是指向named 的指针,或者是指向named 的指针数组。后者似乎是你的意图。

本次分配:

temp->table = malloc(sizeof(named)*100); 

为 100 个named 分配空间,但您需要的是 100 个named *,并且每个都必须指向一个named。鉴于named 的定义,这可能是足够的空间,但是此时您有一个未初始化的指针数组。尝试访问它们会导致 undefined behavior,在这种情况下表现为核心转储。

您需要为指针数组分配空间,然后将每个指针初始化为一个动态分配的named 实例。所以你应该像这样分配空间:

int i;
temp->table = malloc(sizeof(named *)*100);
for (i=0; i<100; i++) {
    temp->table[i] = malloc(sizeof(named));
}

那么你的insert 方法应该可以正常工作了。

【讨论】:

  • 是的,总结一下。使用自己分配的结构的另一种指针分配是temp-&gt;table = malloc(sizeof *(temp-&gt;table) * 100);
  • @dbush 完美,是的,这解决了我的问题。谢谢你。只是为了理解,在这种情况下,(named *)和(named)有什么区别,为什么需要为两者分配空间?抱歉,我是 C 新手,指针和内存分配对我来说真的很难理解,来自 java。
  • @Monkleys named * 是指向named 的指针,而named 是结构本身的一个实例。需要两组分配,因为table 被定义为named **,即一个指向指针的指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多