![]() |
1
41
实际上,它取决于指针的存储。具有静态存储的指针使用空指针初始化。具有自动存储持续时间的指针未初始化。见ISO C 99 6.7.8.10:
是的,由于性能原因,具有自动存储持续时间的对象不会初始化。想象一下,每次调用一个日志函数时都会初始化一个4K数组(这是我在一个项目中看到的,谢天谢地,C让我避免初始化,从而提高了性能)。 |
![]() |
2
26
因为在C语言中,声明和初始化是 故意采取不同的步骤 . 它们故意不同,因为C就是这样设计的。 当你在函数中这样说时:
您在说,“亲爱的C编译器,当您为这个函数创建堆栈框架时,请记住保留
也许生成一些安全的堆栈清除代码并不难。但在每次函数调用时都必须调用它,我怀疑很多C开发人员在自己要填充它的时候是否会感激它。顺便说一句,如果允许您灵活处理堆栈,那么您可以为性能做很多工作。例如,编译器可以在以下情况下进行优化…
如果你
但在更广泛的意义上,(在我看来,更重要的是),它符合C的哲学,即不做太多超过绝对必要的事情。无论您是在使用PDP11、pic32mx(我使用它的目的)还是cray xt3,这都适用。确切地说 为什么? 人们可能会选择使用C语言而不是其他语言。
简而言之,当您请求C编译器跳转时,它不会询问有多高。产生的代码可能不会再出现了。 因为大多数选择用C语言发展的人都喜欢这样,所以它有足够的惯性,不会改变。您的方法可能不是一个固有的坏主意,只是许多其他C开发人员并没有真正要求它。 |
![]() |
3
14
这是为了表演。 C was first developed 大约在pdp 11的时候,60k是一个常见的最大内存量,许多人将拥有更少的内存。不必要的任务会特别昂贵是这种环境 现在有很多使用C的嵌入式设备,60K的内存看起来是无限的,而图12F675有1K的内存。 |
![]() |
4
8
这是因为当您声明一个指针时,C编译器将只保留放置它所需的空间。因此,当您运行程序时,这个非常大的空间中可能已经有了一个值,这可能是先前在内存的这一部分分配的数据的结果。 C编译器可以为这个指针分配一个值,但在大多数情况下,这是浪费时间的,因为在代码的某些部分中,您需要自己分配一个自定义值。 这就是为什么好的编译器在不初始化变量时发出警告的原因;所以我不认为有这么多的bug是因为这种行为。你只需阅读警告。 |
![]() |
5
7
指针在这方面并不特殊;如果未初始化地使用其他类型的变量,则它们具有完全相同的问题:
原因很简单:要求运行时将未初始化的值设置为已知值会增加每个函数调用的开销。对于单个值,开销可能不多,但如果您有大量指针,请考虑:
|
![]() |
6
4
When you declare a (pointer) variable at the beginning of the function, the 编译器将做两件事之一:留出一个寄存器用作 这个变量,或者在堆栈上为它分配空间。对于大多数 处理器,为堆栈中的所有局部变量分配内存 是用一条指令完成的;它计算出所有 本地变量将需要,并下拉(或向上推,对某些变量) processors) the stack pointer by that much. 已经在里面的东西 当时的记忆不会改变,除非你明确地改变 它。 指针没有“设置”为“随机”值。在分配之前, 堆栈指针(SP)下面的堆栈内存包含任何内容 从早期使用开始:
在它为一个本地指针分配内存之后,只有 更改的是堆栈指针:
这允许编译器在一条将堆栈指针向下移动的指令中分配所有本地变量。 (并通过移动堆栈指针,在一条指令中释放它们 备份),但如果需要,强制您自己初始化它们 那样做。 在C99中,您可以混合使用代码和声明,这样就可以推迟 在代码中声明,直到您能够初始化它。这个 将允许您避免将其设置为空。 |
![]() |
7
3
首先,强制初始化不能修复错误。它掩盖了他们。使用没有有效值的变量(以及因应用程序而异的变量)是一个错误。
第二,您可以经常进行自己的初始化。而不是
第三,C(和C++)哲学是给你快速做事的方法。假设您可以选择在语言中实现一种安全的方法来做某件事情,一种快速的方法来做某件事情。你不能通过在它周围添加更多的代码来更快地建立一个安全的方法,但是这样做可以使一个快速的方法更安全。此外,您有时可以通过确保操作在没有额外检查的情况下是安全的,从而使操作快速、安全——当然,假设您可以从快速选项开始。 C最初是设计用来编写操作系统和相关代码的,操作系统的某些部分必须尽可能快。这在C语言中是可能的,但在更安全的语言中就不那么可能了。此外,C是在最大的计算机不如我口袋里的电话强大的时候开发出来的(我很快就升级了,因为它感觉又老又慢)。在经常使用的代码中保存几个机器周期可能会有可见的结果。 |
![]() |
8
1
所以,为了总结Ninjalj所解释的,如果你稍微改变你的示例程序,你需要指出 将 infact初始化为空:
在我的机器上打印 randoma:00000000,randomb:00000000,nulla:00000000,nullab:00000000 |
![]() |
9
0
我认为这是由以下原因引起的:没有理由解释为什么记忆应该包含(通电时)特定的值(0、空或其他)。因此,如果以前没有专门写过,一个内存位置可以包含任何值,从你的角度来看,这个值是随机的(但是这个位置以前可能被其他软件使用过,因此包含一个对该应用程序有意义的值,例如计数器,但从“你的”角度来看,它只是一个随机数)。
要将其初始化为特定的值,至少还需要一条指令;但在某些情况下,您不需要进行此初始化
先验的
,例如
|
![]() |
10
0
当机器通电时,这种与随机存储器内容有关的想法是假的,除了嵌入式系统。任何具有虚拟内存和多进程/多用户操作系统的机器在将内存提供给进程之前都将初始化内存(通常为0)。不这样做将是一个重大的安全漏洞。自动存储变量中的“随机”值来自同一进程以前对堆栈的使用。类似地,malloc/new/etc返回的内存中的“随机”值来自同一进程中以前的分配(随后释放)。 |
![]() |
11
-1
如果它指向空值,则必须将空值赋给它(即使它是自动透明地完成的)。 因此,要回答您的问题,指针不能同时被取消分配和空的原因是指针不能同时被分配和分配。 |
![]() |
Community wiki · C中有哪些耗时的操作? 1 年前 |
![]() |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
![]() |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
![]() |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |