c - 在 main() 中创建的结构变量的范围和用户定义的函数?
问题描述
typedef struct node {
int data;
struct node *next;
} Node;
void checkEmpty(Node *list) {
printf(list == NULL ? "true" : "false");
}
第一次,我创建了这个main()
函数,list
直接在里面做了一个,然后调用checkEmpty()
. 它打印了true
。
int main() {
Node *list;
checkEmpty(list); // it return true
return 0;
}
然后,我创建了一个新函数menu()
,在其中创建了一个list
,然后调用了checkEmpty()
. 它打印了false
。
void menu() {
Node *list;
checkEmpty(list);
}
int main() {
menu(); // it return false
return 0;
}
为什么会这样?
解决方案
函数内部的声明Node *list
不会初始化list
。它的值是不确定的,这意味着它不必表现得好像它有任何固定值。编译器可能会在每次使用时生成使用不同值的代码,例如有时从内存读取或在另一种情况下使用处理器寄存器中的值。
要修复您的程序,请使用或给出list
初始值。Node *list = 0;
Node *list = NULL
还要打开编译器警告并将警告提升为错误。检查您的编译器文档以获取执行此操作的开关。还要注意编译器警告和错误消息。
推荐阅读
- reactjs - 使用 useDispatch 和 useSelector 反应 Hook 测试
- java - lombok - 找不到符号 getId()
- c - “塔计数”给出了正确的输出,但 CodeChef 说“错误的答案”,也许角落案例有问题,但我不知道
- git - “轻量级标签”可以指向树对象或 blob 对象吗?
- apache - Apache 调度程序规则不拒绝 /.json;%0aa.css
- sql - 如何在 1 个表中组合 2 个查询?
- javascript - JavaScript:从 Icons 渲染图标时出错 - Material Design
- php - 查询多个 WHERE 和 CASE PHP(CodeIgniter) MySQL
- git - 带有压缩档案的 Git
- python - 有没有办法让python请求通过用户输入来禁用ssl验证?