只是注意到了一些奇怪的行为,任何人都可以解释并告诉我我在做什么错吗?
我想使用使用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
因此,没有警告,一切似乎井井有条。你怎么看?我想念什么?
答案 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]
中取消引用它时,将导致未定义的行为。