作者LPH66 ((short)(-15074))
看板C_and_CPP
标题Re: [问题] 阵列空元素
时间Wed Aug 19 20:53:33 2009
※ 引述《fantasymew (小孙)》之铭言:
: 在看 Linux kernel 的资料结构时
: 常常看到会有这种宣告方式
: 例如 char entries[0] 这样的宣告方法
: 看起来可能像 label: 这样的作用
: 因为取 sizeof 它并不占空间
: 可以请问前辈们
: 它算是一个定位作用吗?(位移、偏移量)
: 如果是
: 那该怎麽使用呢?
: 谢谢解答
通常这代表这个结构後面会接一个不定长度的东西
在结构中应该会有一个栏位指明这东西有多长
然後实际在配置空间时就会
ptr = malloc(sizeof(TheStructure)+AdditionalBytes);
这样那个宣告为 [0] 的那个阵列就会正好放在多配置出来的这块地方
--
'Oh, Harry, dont't you
see?' Hermione breathed. 'If she could have done
one thing to make
absolutely sure that every single person in this school
will read your interview, it was
banning it!'
---'Harry Potter and the order of the phoenix', P513
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.84
1F:推 hilorrk:但是已宣告的array不能用动态配置吧? 08/19 20:57
2F:→ james732:这种用法在C++似乎行不通了? 08/19 21:01
3F:推 VictorTom:它不是针对array[0]重新做动态配置, 而是那个array[0]的 08/19 21:15
4F:→ VictorTom:宣告会放struct head的最後, 直接相当於衔接struct data 08/19 21:15
5F:→ VictorTom:的头; 不另外用void*或char*的好处事它不用占用空间:) 08/19 21:16
6F:→ james732:咦 所以char*会占一个指标的空间 但是char[0]不会? 08/19 21:16
7F:推 VictorTom:是的:) 小弟随手用DevC++测, 应该C++还是可以用的喔.... 08/19 21:19
8F:→ VictorTom:那个array[0]认知上要当作它是定位/位移用的也OK吧我想. 08/19 21:19
9F:推 VictorTom:印象中常用的地方像网路封包, 用法就像回文的L大写的那 08/19 21:22
10F:→ VictorTom:样, 在AdditionalBytes的范围内, 可以直接用array[N] :) 08/19 21:22
11F:推 littleshan:C++ 标准规定阵列大小必须大於零 08/20 02:03
12F:→ littleshan:g++ 加上 -pedantic 参数後就会报错了 08/20 02:05
13F:推 VictorTom:原来如此, 谢谢l大:) 08/20 02:41
14F:推 ledia:其实也有一些是放 char[1] 的 08/20 14:00
15F:推 su31o4gj83:不太懂为什麽会需要用到这种技巧 @@ 08/20 14:07
16F:→ VictorTom:方便吧, 而且挂pointer的话还得分两次malloc空间XD 08/20 14:10
17F:推 ledia:避免 shallow copy 的问题 ? i guess 08/20 14:10
18F:推 VictorTom:一直都不知道shallow/deep copy这组术语....Orz 08/20 14:13
19F:→ tinlans:C99 新的写法已经可以直接留空了,写 [] 表示它是弹性阵列 08/20 14:56
20F:→ tinlans:,但限制就是它必须是最後一个 data member。 08/20 14:57