指针、malloc 和编译

阿迪·凯塞托维奇

我试图弄清楚指针如何为它们分配内存并声明它们,虽然我有点知道它们是如何工作的,但我仍然感到困惑,我不确定这是因为我的编译器还是什么。

我目前默认使用带有 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章