c - 指针处的值仅在使用时才会更新
问题描述
刚刚注意到一些奇怪的行为,谁能解释并告诉我我做错了什么?
我想使用 C 使用链表指针数组实现一个 Hashset,但是,当我添加我的链表节点时,数据值只有在我先打印出来时才会更新。
这是我的代码:
#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
我认为这可能是编译器工件或其他东西,我通过以下方式进行编译:
$gcc -Wall -Werror -O -o source.c
因此没有警告,一切似乎都井然有序。你怎么看?我错过了什么?
解决方案
在addToSet
中,您在newNode
堆栈上声明,然后将其地址存储在set[bucket]
其中并返回。然后它变成一个悬空指针,当你在main
.
推荐阅读
- gnuplot - gnuplot:显示轴上某些点的值?
- php - 如何隐藏 laravel 5.7 http id
- java - 如何修复 StringBuffer 错误
- windows - 在 Windows 上以编程方式连接 BT 设备
- ios - Firebase - 无法将调用结果类型“[_]”转换为预期类型“_?”
- php - 音频自动播放无限次重复html5
- android - ExpandableListView 重复 ID 问题 - 如何解决?
- c# - 计算句子中单词数的控制台应用程序。(C#)
- mysql - SQL 迁移。保留旧 ID 不起作用
- php - 使用PHP将Json嵌套数组到Mysql中