我试图弄清楚指针如何为它们分配内存并声明它们,虽然我有点知道它们是如何工作的,但我仍然感到困惑,我不确定这是因为我的编译器还是什么。
我目前默认使用带有 GNU/GCC 编译器的 CodeBlocks,这是我正在运行的代码:
#include <stdio.h>
int main()
{
int a = 2;
int *b = 5;
printf("%d\n", a);
printf("%d\n", b);
}
问题是这两个都写出正确的结果,malloc
如果我可以这样写出*b = 5
并声明它,为什么我需要使用它,这不是malloc
将内存分配给指针以便您可以在之后声明它的目的吗?
它允许编译是编译器的错误还是我只是没有明白这一点malloc
?
结果是您期望的事实并不意味着代码是正确的,您的程序格式错误,在int *b = 5
,您将 5 的值分配给一个指针,这将被解释为内存地址,这就是指针用于,因此您可以使用该内存地址访问数据,例如,将其作为函数参数传递,以便可以操作数据。
如果你只想存储一个变量,int
你会使用一个int
变量,所以,虽然不是非法的,但没有多大意义,推迟指针会调用未定义的行为,所以你不能真正将它用作指针,这是它是什么。
您使用malloc
以便系统可以为您的程序和该特定指针提供(分配)一个可用的内存地址,您可以在其中存储数据以供以后使用(5
几乎可以肯定不是那样)。
printf("%d\n", b)
也不正确,打印指针值(即内存地址)的说明符是%p
,这绝对是未定义的行为,正确的表达式是:
printf("%p\n", (void*)b);
C 为程序员提供了做其他编程语言不允许的事情的余地,这是一个优势,但它也可能是一个问题,编译并似乎正常运行的程序可能有问题。当一个格式错误的程序遵守并运行时,它的行为就属于未定义行为的范畴。
这是在标准中定义的,并赋予编译器自由裁量权以任何它认为合适的方式处理代码,包括产生看似正确的结果,问题是这可能在今天有效,明天可能会崩溃,反之亦然,这是完全不可靠。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句