c - C中用于内存分配/指针的星号定位

标签 c pointers memory-management syntax

我是一般编程的初学者,但我最近正在尝试学习 C。

当我阅读 cprogramming.com 上的指针时,我看到类似这样的内容:

int *ptr = malloc( sizeof(*ptr) );

因此,如果我理解正确的话,这会创建一个指针并使其指向一个整数大小的内存地址。

在同一个网站上,在二叉树示例 ( http://www.cprogramming.com/tutorial/c/lesson18.html ) 中,显示了这一行:

*leaf = (struct node*) malloc( sizeof( struct node ) );

据我所知,指针部分并未解释此语法。这实际上是一样的吗?:

struct node *leaf = malloc(sizeof(struct node));

您可能必须转到链接才能查看它的来源,但主要问题是:

第二行是否等同于第一行,如果是,为什么有两种方法可以做同样的事情?如果不是,是什么让它与众不同?

编辑:来自网站的行的来源:

struct node
{
int key_value;
struct node *left;
struct node *right;
};

insert(int key, struct node **leaf)
{
    if( *leaf == 0 )
    {
        *leaf = (struct node*) malloc( sizeof( struct node ) );
        (*leaf)->key_value = key;
        /* initialize the children to null */
        (*leaf)->left = 0;    
        (*leaf)->right = 0;  
    }
    else if(key < (*leaf)->key_value)
    {
        insert( key, &(*leaf)->left );
    }
    else if(key > (*leaf)->key_value)
    {
        insert( key, &(*leaf)->right );
    }
}

最佳答案

请注意,第 18 课中的那行来自不同的上下文:

insert(int key, struct node **leaf)
{
    if (*leaf == 0)
    {
        *leaf = (struct node*) malloc(sizeof(struct node));

作者应该被枪击,因为他写了不能在 C99 下编译的代码而忏悔;函数没有返回类型,函数中也没有返回语句。那是真正的老派编程风格(1989 年之前的老派)。该函数被隐式声明为返回类型 int ,但实际上不返回任何值。这在 C89 中是允许的,但即使在当时也是过时的。该函数的返回类型应为 void因为它不返回任何值。

还要注意——而且更切合你的问题——变量 leafstruct node **或双指针。因此*leafstruct node * .

这与代码不同:

struct node *leaf = malloc(sizeof(struct node));

在这里,leaf是一个指针——*是指定类型是指针类型的声明符的一部分,而在前面的示例中,它是一元 *取消引用运算符。

使用这样的符号有以下优点:

int *ptr = malloc(20 * sizeof(*ptr));

请注意,* 有三种不同的用途在那一行代码中。第一个*表示 ptr 的类型是一个指针(指向 int )。第二个是二元乘法运算符;第三个又是一元取消引用运算符。自 ptr是指向 int 的指针, *ptr是一个 int , 并且分配足够大,可以容纳 20 个 int 的数组值。请注意,如果我将行更改为:

double *ptr = malloc(20 * sizeof(*ptr));

我只改了字int进入double , 但现在代码为 20 double 的数组分配了足够的空间值。更改 doublestruct node并且它为 20 struct node 的数组分配了足够的空间值。相比之下,如果代码最初是:

int *ptr = malloc(20 * sizeof(int));

然后有两个词要改变,让它分配一个double的数组。或 struct node 的数组.

Actor malloc()是有争议的。在纯 C 中,这是不必要的。在 C++ 中,这是至关重要的。在malloc()面前写类型转换的人有很多人会痛斥C 中的等人。我在一个需要强制转换的系统上学习了 C,即使正确声明了 malloc() (当时是 char *malloc(); ,并且没有 <stdlib.h> 可以再声明五年或更长时间;这可以告诉您这是多久以前的事了),所以我仍在使用它。在过去 20 年中学习 C 编程的大多数人都不使用强制转换 — 除非他们的代码也需要由 C++ 编译器编译。 (我的 C 代码可由 C++ 编译器编译,尽管我通常只将它用作 C 代码。)就此而言,您将付钱并选择。

关于c - C中用于内存分配/指针的星号定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25756604/

相关文章:

c - 宏语法困惑

c - 在 C 中解析参数的简单但可靠的方法是什么?

pointers - 通过指针修改数据

iPhone开发-内存释放问题

memory-management - 使用 RefCell 和 Rc 处理循环图中的内存泄漏

c - C 中的 open() 系统调用以字符数组作为附加路径?到文件名

c - 在 C 中打印枚举映射映射

c++ - char* 和 char** 的问题 (C --> C++)

c - 指针和结构问题

c++ - 奇怪的内存行为 - C++