有一些我无法理解的东西c.以下代码:
#include <stdio.h>
int main(char* args){
char abc[100];
printf("%d %d", sizeof(abc), sizeof(abc+1));
}
Run Code Online (Sandbox Code Playgroud)
输出
100 4
Run Code Online (Sandbox Code Playgroud)
我认为它应该生成100 100-1,这是:
100 99
Run Code Online (Sandbox Code Playgroud)
同样的int abc[100].它输出
400 4
Run Code Online (Sandbox Code Playgroud)
代替
400 396
Run Code Online (Sandbox Code Playgroud)
编辑:好的,所以我看到了你的命令.表达式中的abc + 1.因此,结果是int , sizeof(int) == 4. 所以我的另一个问题是为什么我第一次发送一个数组指针,结果是数组的长度?下列:
int main(char* args){
char abc[100];
char *test;
test = (char*)abc+1;
printf("%d %d", sizeof(abc), sizeof(test));
}
Run Code Online (Sandbox Code Playgroud)
输出
100 4
表达方式
abc+1
Run Code Online (Sandbox Code Playgroud)
是一个指针.因此,您的指针似乎是4个字节宽.
另一方面,表达
abc
Run Code Online (Sandbox Code Playgroud)
是一个长度为100的char数组,因此它的大小为100.
至于使用int而不是char的版本,我相信你现在可以应用上面的推理来解释输出.
我认为你对这个问题的编辑基本上要求:
为什么是
abc+1指针和abc数组.
标准说:
其他操作数 - 左值,数组和函数指示符(ISO/IEC 9899:201x 6.3.2.1/3)
除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则将类型为"array of type"的表达式转换为类型为'的表达式'指向类型'的指针,指向数组对象的初始元素,而不是左值.如果数组对象具有寄存器存储类,则行为未定义.
所以,当你写sizeof(abc)那么abc不符合的表达式转换所需要的标准abc为指针.因此abc被视为一个数组.但是在表达式中sizeof(abc+1),abc+1不符合任何列出的异常,因此被转换为指针.
通俗地说,这被称为衰减为指针的数组.
abc+1是一个指针; 因此它的大小是指针或地址的大小,并且4在您的系统上.
请注意,指针的大小取决于平台.正如一条评论所警告的那样:"在Windows 64上,指针大于a的大小long."
你也问为什么它首先给你100,如果它给你4后.
数组就像指针但不是指针.第一次编写时sizeof(abc),它不是编译指针的大小,而是数组的大小.这就是为什么它在第一次尝试时给你100.