gpt4 book ai didi

C:为什么未分配的指针指向不可预测的内存而不是指向 NULL?

转载 作者:太空狗 更新时间:2023-10-29 16:19:18 26 4
gpt4 key购买 nike

很久以前,我在学校用 C 编程。我记得我非常讨厌 C 的一些事情:未分配的指针不指向 NULL。

我问过很多人,包括老师,为什么他们要未分配指针的默认行为不指向 NULL,因为它不可预测似乎更危险。

答案应该是性能,但我从不相信。我认为,如果 C 默认为 NULL,则可以避免编程历史上的许多错误。

这里有一些 C 代码来指出(双关语)我在说什么:

#include <stdio.h>

void main() {

int * randomA;
int * randomB;
int * nullA = NULL;
int * nullB = NULL;


printf("randomA: %p, randomB: %p, nullA: %p, nullB: %p\n\n",
randomA, randomB, nullA, nullB);
}

编译时带有警告(很高兴看到 C 编译器比我在学校时好得多)并输出:

随机A:0xb779eff4,随机B:0x804844b,空A:(无),空B:(无)

最佳答案

其实还是要看指针的存储。具有静态存储的指针用空指针初始化。具有自动存储持续时间的指针不会被初始化。参见 ISO C 99 6.7.8.10:

If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then:

  • if it has pointer type, it is initialized to a null pointer;
  • if it has arithmetic type, it is initialized to (positive or unsigned) zero;
  • if it is an aggregate, every member is initialized (recursively) according to these rules;
  • if it is a union, the first named member is initialized (recursively) according to these rules.

是的,出于性能原因,具有自动存储持续时间的对象不会被初始化。想象一下在每次调用日志函数时初始化一个 4K 数组(我在我从事的项目中看到的东西,谢天谢地 C 让我避免了初始化,从而提高了性能)。

关于C:为什么未分配的指针指向不可预测的内存而不是指向 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3101896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com