我看到了这样的示例代码的一部分:
1 void func (uint8_t *buffer, uint16_t length)
2 {
3 uint8_t *pack = {0};
4
5 for(int i=0; i<length; i++)
6 {
7 pack[i] = buffer[i];
8 }
9
10 // send out the "pack" here
11 }
这是一个应该填充&#34;缓冲区&#34;中的数据的函数。 to&#34; pack&#34;,然后发送&#34; pack&#34;到串行连接。
第3行有什么作用?这就像定义一个所有元素为0的结构,但它是一个指针!这个指针指向哪里?在下面的for循环中,为什么它可以更改为数组(pack [i])以及为什么我们不需要声明大小如下:
uint8_t pack_array[length], *pack;
*pack = pack_array;
编译器是GCC。
[编辑]:for循环中有拼写错误。
答案 0 :(得分:3)
根据C99标准,6.7.8p11:
标量的初始值设定项应为单个表达式,可选择用大括号括起来。
术语&#34;标量&#34;是指算术类型和指针。
所以括号是允许的,什么都不做。
行uint8_t *pack = {0};
将使用值pack
初始化指针0
,因此它将是一个空指针。
以下for
循环错误。两者都是因为它中的表达式顺序不正确,并且因为赋值取消引用pack
,这是一个空指针。
答案 1 :(得分:0)
在您的代码段中,未为pack
分配内存。在不分配内存的情况下,您不能将其用作下标数组。
for(int i=0; i++; i<length)
错了。 i<length
应该是for
循环的第二个表达。