LS错误。数组是数组,本身不是指针;数组退化为对应指针仅在传递函数参数等少数情形下成立——而且这些情况下,数组本身不变,只是另外构造了一个和指向数组首元素的指针(这样数组和指针的值相等)而已。
指针无论是在编译期还是在运行期都不包含指向的对象的类型信息。对于sizeof,是在编译期计算的,只有对于数组名称或&数组名称直接作用才能体现数组左值语义而返回整个数组的大小,对于指向数组首地址的指针而言,和其它指针一样仍然只返回指针本身的大小。
例如
char a[10] = {'a'};
char* p = a;
char* q = &a[2];
sizeof(a); /* 结果为10*/
sizeof(&a); /* 结果为10*/
sizeof(p); /* 结果在32位平台上为4*/
sizeof(q); /*结果等于sizeof(p)*/
所以,结论是无法通过指针本身判断指向对象的类型以及所占空间的大小。所以,老老实实另外保存一个标志变量或者长度(0为非数组)来判断比较稳妥(如果是结构体变量,也可以用一个成员作为标志变量,不过比较浪费就是了)。
====
[原创回答团]
没办法直接判断,因为指针本身是不包含那些信息的,它只描述一个地址,sizeof()函数也只是能判断字符数组,也是根据字符数组最后一个符为NULL判断的,如果不将最后一个字符设为NULL也就没有效果。sizeof()函数好像不能用于单个字符变量,如果没猜错。如果要判断就只能另用变量作记录了。
数组的sizeof值等于数组所占用的内存字节数,如:
char a1[] = "abc";
int a2[3];
sizeof( a1 ); // 结果为4,字符 末尾还存在一个NULL终止符
sizeof( a2 ); // 结果为3*4=12(依赖于int)
这个是没法直接判断出来的,只有跟踪代码通过赋值时的语句来间接判断。