gpt4 book ai didi

C 指针 "type ** name"与 "type * name[]"作为参数

转载 作者:行者123 更新时间:2023-12-02 04:51:54 24 4
gpt4 key购买 nike

我有点困惑。下面是一个非常简单的例子:

#include <stdlib.h>

typedef struct
{
unsigned char one: 1;
unsigned char two:1;
unsigned char three: 1;
unsigned char four: 1;
} nibble_bits;

typedef union
{
unsigned char all : 4;
nibble_bits bits;
} nibble;

void initArr(nibble ** arrLoc, unsigned int size)
{
nibble * start = arrLoc[0];
int i =0;
for (i=0; i<size; i++)
{
start[i].all = 0;
}
}

int main()
{
nibble * fourNibbles = (nibble *) malloc(4 * sizeof(nibble));
initArr(&fourNibbles,4);
}

这可以正常编译,没有任何警告。但是,当我更改 main 中的第一行时:

nibble * fourNibbles = (nibble *) malloc(4 * sizeof(nibble));

到:

nibble fourNibbles[4];

我得到以下信息:

警告:main.c:在函数“main”中:main.c:150: 警告:从不兼容的指针类型传递‘initArr’的参数 1

运行时,我收到“总线错误 10”。

在我看来,这些行都在做同样的事情,除了 malloc 正在为堆上的数组分配空间并且数组声明在堆栈上。但是(我认为)无论哪种方式,“fourNibbles”都是“指向半字节的指针”类型,因此“fourNibbles”的地址将是指向半字节指针(半字节 **)的指针。

我在这里错过了什么?

最佳答案

这些甚至都不是一回事。这个

nibble * fourNibbles = (nibble *) malloc(4 * sizeof(nibble));

声明一个指针fourNibbles,而这个

nibble fourNibbles[4];

声明一个数组。数组和指针是两个完全不同的东西,它们(在对象级别)没有任何共同点。试图在对象上下文中互换使用它们(如 & 运算符)只会导致灾难。在 SO(搜索“数组指针差异”)以及此 [实际标准] C FAQ:http://c-faq.com/aryptr/index.html 中有很多关于此主题的信息。

不过,还有另一件事在您的代码中引起了注意。你的功能

void initArr(nibble ** arrLoc, unsigned int size)

专门为第一个变体量身定制,因为它需要一个指向指针 的指针作为它的第一个参数。如果您试图将指向数组的指针强制指向第一个参数(您已经有机会亲眼观察到),它将不起作用。

但是,这里真正的问题是为什么您的 initArr 函数以如此奇怪的方式编写。这个序列

void initArr(nibble ** arrLoc, unsigned int size)
{
...
nibble * start = arrLoc[0];
...
start[i].all = 0;

看起来很不寻常。为什么要将指针传递给指针而不是普通的单级指针?例如。你可以简单地做

void initArr(nibble *start, unsigned size)
{
unsigned i;
for (i = 0; i < size; ++i)
start[i].all = 0;
}

这个版本将被称为

initArr(fourNibbles,4); /* note: no `&` operator */

并且它将与 malloc 编辑的数组和显式声明的数组兼容。

附言在 C 语言中,malloc 的一个更好的习惯用法是

nibble * fourNibbles = malloc(4 * sizeof *fourNibbles);

请注意,在此变体类型名称中,nibble 仅被提及一次。

关于C 指针 "type ** name"与 "type * name[]"作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18663099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com