愿所有美好如期而遇
第三组笔试题
char *p = "abcdef"; printf("%d\n", sizeof(p)); printf("%d\n", sizeof(p+1)); printf("%d\n", sizeof(*p)); printf("%d\n", sizeof(p[0])); printf("%d\n", sizeof(&p)); printf("%d\n", sizeof(&p+1)); printf("%d\n", sizeof(&p[0]+1)); printf("%d\n", strlen(p)); printf("%d\n", strlen(p+1)); printf("%d\n", strlen(*p)); printf("%d\n", strlen(p[0])); printf("%d\n", strlen(&p)); printf("%d\n", strlen(&p+1)); printf("%d\n", strlen(&p[0]+1));
答案
8 8 1 1 8 8 8
6 5 error error 随机值 随机值 5
(博主用的是64位机器,所以地址占的空间大小为8字节,如果得4的话,是32位机器)
解析
char* p = "abcdef"; printf("%d\n", sizeof(p)); //p是字符指针,大小为4/8 printf("%d\n", sizeof(p + 1)); //p指向字符'b',求的还是p的大小,4/8 printf("%d\n", sizeof(*p)); //p指向'a',解引用访问'a',所以大小为1个字节 printf("%d\n", sizeof(p[0])); //'a',1字节 printf("%d\n", sizeof(&p)); //&p,指针类型为char**,还是指针,4/8 printf("%d\n", sizeof(&p + 1)); //跳过一个char**大小的指针,还是char**类型的指针,4/8 printf("%d\n", sizeof(&p[0] + 1)); //指向'b'的指针,4/8 //-------------------------------------------------------- //-------------------------------------------------------- printf("%d\n", strlen(p)); //长度为6 printf("%d\n", strlen(p + 1)); //长度为5 printf("%d\n", strlen(*p)); //error, *p是'a',ASCII值为97,当做地址传入strlen, //成为野指针,非法访问 printf("%d\n", strlen(p[0])); //同理 printf("%d\n", strlen(&p)); //随机值,指针类型为char**,指向p这个指针 //注意p是指向字符串首元素的。 printf("%d\n", strlen(&p + 1)); //随机值,同理 printf("%d\n", strlen(&p[0] + 1)); //指向第二个字符,长度为5