标量对象在初始化程序中需要一个元素

时间:2014-07-23 08:19:47

标签: c pointers

为什么我要初始化uint8_t

的以下向量
uint8_t *mmac_source1 = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x01 };

我收到此错误

Error: scalar object 'mmac_source1' requires one element in initializer

但是当我使用它时:

uint8_t mmac_source1[6] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x01 };

它工作正常。

3 个答案:

答案 0 :(得分:7)

uint8_t *mmac_source1 = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x01 }; 

这里没有分配给指针的内存。 mmac_source1只是作为占位符,您可以存储地址。

uint8_t mmac_source1[6] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x01 };

这里有一个数组,编译器在其中分配sizof(uint8_t)*6个字节。

答案 1 :(得分:3)

在许多情况下,指针可与数组互换。更正式地说,可以说数组的第一个元素衰减到指针。

但是有一些例外,你引用的问题就是其中之一:uint8_t *mmac_source1 = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x01 };在语法上不合法。从概念上讲,在第二种情况下,您将在堆栈上分配数组。在那个例子中使用指针是没有意义的。

答案 2 :(得分:1)

指针初始化所需的rvalue是一个内存地址。

与数组的情况一样,编译器允许我们想要在声明指针的同时初始化指针指向常量的内容的特殊情况:

char * str = "hello"; // what succeeds the equal to is the rvalue.

以上陈述与

类似
char str[] = "hello";

接下来的问题是我们是否可以执行以下操作:

int* v = 2;

是的我们自己承担风险。编译器最初会附带 错误:

error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]

这里编译器认为rvalue只是一个整数,它所期望的是一个内存位置,例如& a 左右。同时 它提供了一个选项 fpermissive 覆盖其假设 我们可以强制rvalue看起来像一个内存地址。 fpermissive 标志 将有关不合格代码的一些诊断从错误降级为警告。所以在编译时,我做了

g ++ -fpermissive intpointerexample.cpp -o intpointerexample

最终在执行intpointerexample时,我遇到了分段错误,因为我可能试图访问程序无权访问的内存。