在C++中sizeof('a') == sizeof(char) == 1.这具有直观意义,因为它'a'是一个字符文字,并且sizeof(char) == 1由标准定义.
然而,在C中sizeof('a') == sizeof(int).也就是说,看起来C字符文字实际上是整数.有谁知道为什么?我可以找到很多关于这个C怪癖的提及,但没有解释为什么它存在.
为什么作为参数发送的数组的大小与main中的相同?
#include <stdio.h>
void PrintSize(int p_someArray[10]);
int main () {
int myArray[10];
printf("%d\n", sizeof(myArray)); /* As expected, 40 */
PrintSize(myArray);/* Prints 4, not 40 */
}
void PrintSize(int p_someArray[10]){
printf("%d\n", sizeof(p_someArray));
}
Run Code Online (Sandbox Code Playgroud) 我试图声明一个依赖于另一个结构的结构.我想用来sizeof保证安全/迂腐.
typedef struct _parent
{
float calc ;
char text[255] ;
int used ;
} parent_t ;
Run Code Online (Sandbox Code Playgroud)
现在我想声明一个child_t大小相同的结构parent_t.text.
我怎样才能做到这一点?(下面的伪代码.)
typedef struct _child
{
char flag ;
char text[sizeof(parent_t.text)] ;
int used ;
} child_t ;
Run Code Online (Sandbox Code Playgroud)
我试着用几种不同的方法parent_t和struct _parent,但我的编译器不接受.
作为一个技巧,这似乎工作:
parent_t* dummy ;
typedef struct _child
{
char flag ;
char text[sizeof(dummy->text)] ;
int used ;
} child_t ;
Run Code Online (Sandbox Code Playgroud)
是否可以在child_t不使用的情况下声明dummy?
我们知道这sizeof是一个用于计算任何数据类型和表达式大小的运算符,当操作数是表达式时,括号可以省略.
int main()
{
int a;
sizeof int;
sizeof( int );
sizeof a;
sizeof( a );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
第一次使用sizeof是错误的,而其他人则是对的.
当使用gcc编译时,将给出以下错误消息:
main.c:5:9: error: expected expression before ‘int’
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么C标准不允许这种操作.会不会sizeof int引起任何歧义?
有机器(或编译器),在哪里sizeof(char) != 1?
C99标准是否说sizeof(char)标准合规性实施必须正好1?如果有,请给我部分编号和引文.
更新:
如果我有一台机器(CPU),它不能寻址字节(最小读取是4个字节,对齐),但只有4-s的字节(uint32_t),这个机器的编译器可以定义 sizeof(char)为4吗?sizeof(char)将是1,但char将有32位(CHAR_BIT宏)
Update2: 但是sizeof结果不是BYTES!这是CHAR的大小.char可以是2个字节,或者(可能是)7位?
Update3:
好的.所有机器都有sizeof(char) == 1.但机器有CHAR_BIT > 8什么?
我正在处理C++中一些lambda的记忆,但我对它们的大小感到有些困惑.
这是我的测试代码:
#include <iostream>
#include <string>
int main()
{
auto f = [](){ return 17; };
std::cout << f() << std::endl;
std::cout << &f << std::endl;
std::cout << sizeof(f) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
你可以在这里运行它:http://fiddle.jyt.io/github/b13f682d1237eb69ebdc60728bb52598
ouptut是:
17
0x7d90ba8f626f
1
Run Code Online (Sandbox Code Playgroud)
这表明我的lambda的大小是1.
这怎么可能?
lambda至少应该是指向它的实现的指针吗?
当我们检查函数的大小时sizeof(),我们总是得到1个字节.这个1字节表示什么?
有一个旧帖子要求一个sizeof可以返回的构造0.高信誉用户有一些高分答案说,按标准,没有类型或变量可以有0的大小.我同意100%.
然而,这个新的答案提出了这个解决方案:
struct ZeroMemory {
int *a[0];
};
Run Code Online (Sandbox Code Playgroud)
我正要进行投票和评论,但是在这里度过的时间教会我检查我100%肯定的事情.所以...让我惊讶的是,gcc并clang显示出相同的结果:sizeof(ZeroMemory) == 0.更重要的是,变量的大小是0:
ZeroMemory z{};
static_assert(sizeof(z) == 0); // Awkward...
Run Code Online (Sandbox Code Playgroud)
Whaaaat ...?
这怎么可能?
以下无法编译:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
Run Code Online (Sandbox Code Playgroud)
但如果我改成它
sizeof(arr);
Run Code Online (Sandbox Code Playgroud)
一切都好.为什么?