【问题标题】:calloc typecasting to pointer to pointercalloc 类型转换为指向指针的指针
【发布时间】:2011-12-29 12:05:59
【问题描述】:

这句话是什么意思?

//allocated memory for Device info

(*PppsCoreStructure)->psDeviceDetails=(sDeviceDetails **)calloc(CORE_DEVICEINFO_SIZE, sizeof(sDeviceDetails*));

我知道 '(*PppsCoreStructure)->psDeviceDetails' 是一个指向指针的指针。但我无法想象 calloc 如何返回指向指针的指针?我是初学者请帮忙

【问题讨论】:

    标签: c


    【解决方案1】:

    calloc 的调用为CORE_DEVICEINFO_SIZE 指向sDeviceDetails 对象的指针分配了足够的空间。 calloc 返回一个简单的内存缓冲区,可以用来存储任何东西;在这种情况下,指针。

    (请注意,依靠calloc 返回填充空指针的缓冲区是不可移植的:它返回零填充缓冲区,但空指针不一定全为零。不过,它在常见平台上。)

    【讨论】:

    • 感谢您的回复先生,但我想知道 (sDeviceDetails *)calloc 与 (sDeviceDetails **)calloc 有何不同。
    • @SHRI:正如我所解释的,calloc 在这里用于为指向sDeviceDetails 的指针分配空间。在为 struct sDeviceDetails 或其中的数组分配空间时,您将使用强制转换 sDeviceDetails*
    • (sDeviceDetails *)calloc(...) 要求 sDeviceDetails 是数组或指针类型(或者您只要求 calloc 单个元素 - 即 CORE_DEVICEINFO_SIZE = 1)。因为calloc 分配了几个连续的内存块,所以它的返回值是指向指针的指针,就像指向数组的指针就像指向指针的指针一样
    【解决方案2】:

    函数分配一个指针数组。 CORE_DEVICEINFO_SIZE 是这个数组中的指针数量。

    (sDeviceDetails **) 意味着编写代码的程序员不知道 void-pointer casts 在 C 语言中是如何工作的。演员表是多余的,应该被删除。

    【讨论】:

    • 对不起,为什么停止编译器警告是多余的?它使真正的警告成为可能,看不到?
    • 这种类型转换删除真正的警告,例如,如果您不小心尝试在指针中存储指向指针的指针。这就是为什么这是不好的做法。 (C++ 是另一回事,但这个问题是关于 C 的。)Read any number of posts about it on SO
    【解决方案3】:
    • (*PppsCoreStructure)->psDeviceDetails 声明为 sDeviceDetails ** 类型
    • calloc() 的返回值是void* 类型
    • (sDeviceDetails **)calloc(...)calloc 的返回值转换为 sDeviceDetails ** 类型

    在 C++ 语言中,这种类型转换是必不可少的,尽管在 C++ 中通常不会使用 calloc 并且可能会使用 C++ 转换。

    在 C 语言中不需要类型转换,因为 void* 指针的赋值与所有其他指针类型兼容。


    在您声明的评论中

    但我想知道sDeviceDetails*sDeviceDetails** 有何不同

    我怀疑这实际上是你真正的问题。

    答案很简单:T* 是指向 T 的指针,T** 是指向 T 的指针。

    【讨论】:

    • 我的意思是,据我所知,calloc/malloc 创建一个新空间并将其地址返回给一个指针。所以 T* 是正确的。我明白了。但是对于 T**,calloc/malloc 应该创建新空间,将其分配给指针。再一次,该指针的地址将被分配给 T**。我认为是正确的吗?如果正确,那个中间指针呢?
    • @SHRI 您对calloc 的调用仅分配指针数组。然后,您必须在该数组中分配每个指针。
    猜你喜欢
    • 2013-11-23
    • 2021-09-20
    • 1970-01-01
    • 2015-08-12
    • 2020-06-15
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多