2012-08-08 73 views
0

我使用的在碳化物C C这部分代码/ C++表示阵列额外数据值

char c1[]={0x01}; 
    char c2[]={0x02}; 
    char* c [] = {c1,c2}; 

当我检查[0],C [1] ..我看到两个值的C值像这样在调试模式下

c[0] = \x01\x01 & (x) = *[0] = \x01 
c[1] = \x02\x01\x01 & (x) = *[1] = \x02 

,如果我计算长度这样

int cclen2 = strlen(c[0]); 

得到cclen2 = 2;但我应该得到的值作为1

回答

3

c1c2没有空终止,并strlen()需要一个空终止(与很多其他的C字符串处理函数,像printf("%s", c1)例如一起)。当字符串文字用于初始化char[]时,只会隐式添加空终止符。

更改为:

char c1[] = { 0x01, 0x00 }; 
char c2[] = { 0x02, 0x00 }; 

或:

char c1[] = "\x01"; 
char c2[] = "\x02"; 
1

阵列创建一个特殊的类型恒定指针。如果你将它声明为char,那么最后会添加一个空字符。 实际上你的c [0]语句被替换为*(c + 0);并获得地址c。 (c)代替strlen(c [0]); 和你有全长的字符串,直到空字符。

我认为这是足够的解释。