完整的例子:
#include <stdio.h>
void test(int arr[]) {
int arrSize = (int)(sizeof(arr) / sizeof(arr[0]));
printf("%d\n", arrSize); // 2 (wrong?!)
}
int main (int argc, const char * argv[]) {
int point[3] = {50, 30, 12};
int arrSize = (int)(sizeof(point) / sizeof(point[0]));
printf("%d\n", arrSize); // 3 (correct :-) )
test(point);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在将它传递给函数之前,sizeof给出了正确的值.在函数中完全相同的数组上执行完全相同的操作会产生奇怪的结果.缺少一个元素.为什么?
可能重复:
C++中的空类C
中空结构的大小是多少?
我在某处看到C++中空结构的大小为1.所以我想到验证它.不幸的是我把它保存为C文件并使用了<stdio.h>标题,我很惊讶地看到了输出.这是0.
这意味着
struct Empty {
};
int main(void)
{
printf("%d",(int)sizeof(Empty));
}
Run Code Online (Sandbox Code Playgroud)
在编译为C文件时打印0,在编译为C++文件时打印1.我想知道原因.我读到c ++中的sizeof空结构不为零,因为如果大小为0,则该类的两个对象将具有相同的地址,这是不可能的.我哪里错了?
我对C++很新,但我发现这种auto奇怪的行为:
class A{};
int main() {
A a;
auto x = -(sizeof(a));
cout << x << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
unsigned在这种情况下,变量x 虽然我在变量的初始化时使用了一元减运算符.为什么只考虑sizeof(std::size_t)的返回类型而不是因为使用的运算符而存储的数字是否为负的事实?
我知道size_t是一个unsigned int.
我用GCC 8.1.0和C++ 17试过这个.
码:
#include<iostream>
using namespace std;
int main()
{
size_t i = sizeof new int;
cout<<i;
}
Run Code Online (Sandbox Code Playgroud)
在GCC编译器中,工作正常,没有任何警告或错误和打印输出8.
但是,在clang编译器中,我收到了以下警告:
warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
size_t i = sizeof new int;
Run Code Online (Sandbox Code Playgroud)
sizeof new int;未定义的行为?在C中,我有一个结构数组定义如下:
struct D
{
char *a;
char *b;
char *c;
};
static struct D a[] = {
{
"1a",
"1b",
"1c"
},
{
"2a",
"2b",
"2c"
}
};
Run Code Online (Sandbox Code Playgroud)
我想确定数组中元素的数量,但sizeof(a)返回不正确的结果:48,而不是2.我做错了什么,或者sizeof这里根本不可靠?如果重要的话我正在使用GCC 4.4进行编译.
这可能是一个愚蠢的问题,但是当你没有传入数组中的元素数量时,sizeof运算符如何知道数组操作数的大小.我知道它不会返回数组中的总元素,而是以字节为单位返回大小,但为了得到它,它仍然必须知道数组何时结束.只是好奇这是如何工作的.
为什么int64位编译器通常是32位?当我开始编程时,我被教过int通常与底层架构的宽度相同.我同意这也是有道理的,我发现未指定的宽度整数与底层平台一样宽是合乎逻辑的(除非我们说的是8或16位机器,这样的小范围int几乎不适用).
后来我int在大多数64位平台上学到的通常是32位.所以我想知道这是什么原因.对于存储数据,我更喜欢明确指定数据类型的宽度,因此这留下了通用用法int,这不会提供任何性能优势,至少在我的系统上我对32位和64位整数具有相同的性能.这样就留下了二进制内存占用空间,虽然不是很多,但会略有减少.
在C或C++中,当运算符在运算符中时,不执行递增和递减运算符(++n,--n)sizeof().
int n = 100;
int size_int = sizeof(++n);
std::cout<<n;
Run Code Online (Sandbox Code Playgroud)
我编写了这段代码并运行程序.当然,我认为101将会为我展示.但是,n不是101,它是100.
这是为什么?
我只是遇到了这个简单的代码片段,我想知道为什么当它由C编译器编译时该程序的输出是4什么时候它是由C++编译的8.
#include <stdio.h>
int x;
int main(){
struct x {int a; int b;};
printf("%d", sizeof(x));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C++输出是rational(8 = 4 + 4 = sizeof(x.a) + sizeof(x.b)),但C的输出不是.那么,sizeof在C中如何工作?
似乎C更喜欢全局变量而不是本地变量.这样对吗?
在C中,我需要知道结构的大小,其中包含函数指针.我可以保证在所有平台和架构上:
我认为所有这些答案都是肯定的,但我想确定.对于上下文,我正在呼唤sizeof(struct mystruct),仅此而已.