Tag: sizeof

如何使用sizeof找出变量的大小

让我们假设我已声明某个数据类型的变量’i’(可能是int,char,float或double)… 注意:只需考虑声明’i’,如果它是int或char或float或double数据类型,则不要打扰。 由于我想要一个通用的解决方案,我只是简单地提到变量’i’可以是任何一种数据类型,即int,char,float或double。 现在我可以找到没有sizeof运算符的变量’i’的大小吗?

sizeof float(3.0)vs(3.0f)

sizeof(3.0)和sizeof(3.0f)有什么区别 我期待他们两个给出相同的结果(sizeof float)..但它的不同。 在32位机器中,gcc编译器,sizeof(3.0f)=> 4 sizeof(3.0)=> 8 为什么这样?

当我应用sizeof运算符时,为什么会得到不同的结果?

我有这个程序 #include int main() { char arr[100]; printf(“%d”, (int)sizeof(0,arr)); } 这在编译为C文件时打印4,并将100打印为C ++文件。 为什么? 我正在使用gcc。

操作内存时是否需要乘以sizeof(char)?

当使用malloc并进行类似的内存操作时,我可以依赖sizeof(char)始终为1吗? 例如,我需要为char类型的N个元素分配内存。 是否需要乘以sizeof( char ) : char* buffer = malloc( N * sizeof( char ) ); 或者我可以依赖sizeof(char)始终为1并且只是跳过乘法 char* buffer = malloc( N ); 我完全理解在编译期间评估sizeof然后编译器甚至可以编译出乘法,因此性能损失将是最小的并且很可能为零。 我主要询问代码清晰度和可移植性。 char类型是否需要这种乘法?

size_t的最大大小

我知道在C返回类型的sizeof运算符是size_t是定义的无符号整数类型。 这意味着它的最大尺寸应为65535如C99标准7.18.3所述 : limit of size_t SIZE_MAX 65535 但是在gcc-4.8.2头文件中, stdint.h定义了它的大小远大于65535与C99标准中规定的相反,如下所示, /* Limit of `size_t’ type. */ # if __WORDSIZE == 64 # define SIZE_MAX (18446744073709551615UL) # else # define SIZE_MAX (4294967295U) # endif 请帮助我理解为什么在我的误解背后存在差异或原因。

使用gcc时,为什么在Linux和Windows上打包结构的大小会有所不同?

在下面的代码中,为什么在使用gcc编译时,在Linux和Windows上打包结构的大小是不同的? #include #include // id3 header from an mp3 file struct header { uint8_t version[ 2 ]; uint8_t flags; uint32_t size; } __attribute__((packed)); int main( int argc, char **argv ) { printf( “%u\n”, (unsigned int)sizeof( header ) ); return 0; } 使用的gcc版本: $ g++ –version g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 $ x86_64-w64-mingw32-g++ –version x86_64-w64-mingw32-g++ (GCC) 4.7.0 […]

使用malloc分配char数组

嗨,最近我在网上看到了很多代码(也是关于SO;),如: char *p = malloc( sizeof(char) * ( len + 1 ) ); 为什么sizeof(char)? 这不是必要的,不是吗? 或者只是风格问题? 它有什么优势?

“sizeof(arr )”会导致未定义的行为吗?

有一个众所周知的模式来计算数组长度: int arr[10]; size_t len = sizeof(arr) / sizeof(arr[0]); assert(len == 10); 此模式适用于静态数组和常量大小的自动数组。 它也适用于C99中的可变长度数组。 我想应用类似的想法来计算动态数组大小(以字节为单位): size_t known_len = 10; int *ptr = malloc(known_len * sizeof(int)); size_t size = known_len * sizeof(ptr[0]); assert(size == known_len * sizeof(int)); 这比known_len * sizeof(int)更好,因为sizeof(ptr[0])不引用实际的数组元素类型。 因此,它不需要代码的读者知道类型。 但是我不清楚表达式sizeof(ptr[0])会导致不确定的行为。 随着它扩大: sizeof(ptr[0]) -> sizeof(*((ptr) + (0))) -> sizeof(*ptr) 如果ptr为0 ,结果表达式是有问题的: sizeof(*((int*) 0)) 根据C99标准: (C99,6.3.2.3p3):“值为0的整型常量表达式,或者类型为void […]

C中的指针实现细节

我想知道违反我在下面列出的假设的架构 。 此外,我想知道所有架构的假设是否都是错误的(也就是说,如果它们中的任何一个完全错误的话)。 sizeof(int *)== sizeof(char *)== sizeof(void *)== sizeof(func_ptr *) 无论指向何种数据类型,给定体系结构的所有指针的内存中表示都是相同的。 指针的内存中表示与与体系结构相同的位长的整数相同。 指针数据类型的乘法和除法仅被编译器禁止。 注意:是的,我知道这是荒谬的。 我的意思是 – 是否有硬件支持禁止这种不正确的用法? 所有指针值都可以转换为单个整数。 换句话说,哪些架构仍然使用分段和偏移? 增加指针相当于将sizeof(the pointed data type)到指针存储的内存地址。 如果p是int32*则p+1等于p后4个字节的存储器地址。 我最习惯在连续的虚拟内存空间中使用指针。 对于这种用法,我通常可以将它们视为数字线上的地址。 请参阅堆栈溢出问题指针比较 。

sizeof(int )是什么意思?

我是Linux内核的新手。 我正在读取文件ioctl.h ,在那里我遇到了一个宏_IOC_TYPECHECK(t) ,它看起来像这样: #define _IOC_TYPECHECK(t) \ ((sizeof(t) == sizeof(t[1]) && \ sizeof(t) < (1 << _IOC_SIZEBITS)) ? \ sizeof(t) : __invalid_size_argument_for_IOC) 你能解释一下这段代码吗? 在这段代码中, sizeof(t[1])是什么意思?