指针的值仅在使用时更新

时间:2018-10-02 02:43:05

标签: c pointers gcc

只是注意到了一些奇怪的行为,任何人都可以解释并告诉我我在做什么错吗?

我想使用使用C的一系列链接列表指针来实现哈希集,但是,当我添加链接列表节点时,只有先打印出来,数据值才会更新。

这是我的代码:

@app.route('/aaa/<bbb>/')
@limiter.limit("100/hour", my_key_func)
def hello_world(bbb):

您可以看到有一条注释行,如果我这样编译它,则将不会存储该值,并给出以下输出(这不是我期望的):

#include <stdio.h>
#define print(ref) printf(#ref" = %d\n",ref);
#define HASH_MODULE 13

typedef struct listNode{
    int data;
    struct listNode*next;
}listNode;

void addToSet(int,listNode**);
int hashCode(int);


int main(){
    listNode*linkedListHashset[HASH_MODULE];

    addToSet(10,linkedListHashset);
    print(linkedListHashset[10]->data);

    return 0;
}

void addToSet(int value, listNode**set){
    int bucket = hashCode(value);
    print(bucket);
    listNode newNode = {value};
    newNode.next = set[bucket];
    set[bucket] = &newNode;
    //print(set[bucket]->data);
}

int hashCode(int value){
    return value%HASH_MODULE;
}

但是,当我包括注释行时,这是输出,它确实反映了所需的更新,在这里指针处的数据的行为符合我的预期:

bucket = 10
linkedListHashset[10]->data = 0

我认为这可能是编译器工件或某些东西,我通过这样做进行编译:

bucket = 10
set[bucket]->data = 10
linkedListHashset[10]->data = 10

因此,没有警告,一切似乎井井有条。你怎么看?我想念什么?

1 个答案:

答案 0 :(得分:1)

// using Microsoft.Extensions.Caching.Memory; public class MyMemoryCache { public MemoryCache Cache { get; set; } public MyMemoryCache() { Cache = new MemoryCache(new MemoryCacheOptions { SizeLimit = 1024 }); } } 中,您要在堆栈上声明addToSet,然后将其地址存储在newNode中并返回。然后,它变成了一个悬空指针,当您在set[bucket]中取消引用它时,将导致未定义的行为。