打印尺寸类型:C

时间:2017-11-13 05:35:30

标签: c

我想打印

“(类型)的大小是(类型的大小)字节”
 例如

“int的大小为4Byte”
 通过下面的代码。但它说 “int的大小是8Byte”
我认为这段代码显示了string(int)的大小,但是类型为int。 我该如何解决这个问题?

代码

#include <stdio.h>
char *variabletype[] = {"char", "unsigned char", "signed char", "int", "unsigned int", "short", "unsigned short", "long", "unsigned long", "long long", "unsigned long long"};

int main() {
    for (int i = 0; i < 11;++i) {
        printf("Size of %s is %u\n",variabletype[i], (unsigned int)(sizeof(variabletype[i])));
    }
    return 0;
}

返回

Size of char is 8Byte
Size of unsigned char is 8Byte
Size of signed char is 8Byte
Size of int is 8Byte
Size of unsigned int is 8Byte
Size of short is 8Byte
Size of unsigned short is 8Byte
Size of long is 8Byte
Size of unsigned long is 8Byte
Size of long long is 8Byte
Size of unsigned long long is 8Byte

2 个答案:

答案 0 :(得分:6)

sizeof在编译时是operator计算 。它返回一个编译时常量(VLA s除外)。在您的代码中,您始终打印sizeof(char*)(在您和我的计算机上恰好是8)。请记住,即使数组衰减为指针,数组也不会与指针相同。

你想:

printf ("sizeof int is %zu\n", sizeof(int));
printf ("sizeof long is %zu\n", sizeof(long));

您可以使用preprocessor技巧(stringizing#

#define PRINTSIZE(Type) printf("sizeof " #Type " is %zu\n", sizeof(Type))
PRINTSIZE(int);
PRINTSIZE(long);

C语言将翻译时间和运行时间分开。实际上,您使用的是compiler(有时甚至是cross-compiler)。标准C中没有eval operator

在许多操作系统上,您可以运行另一个编译过程(可能使用systempopen(3)),但是如何运行编译器是系统特定的(在Linux上,您经常使用{{ 1}};在Windows上,它可能是其他东西)。

因此原则上你可以在Linux上编写一个生成临时C文件的程序,然后对某些计算字符串使用system(3)两次:一次运行编译,另一次运行生成的可执行文件。但这很复杂(而且不便携),所以不值得你花时间。

请注意,在C(和C ++)中,类型,语句,表达式,变量名称等只有编译器知道,并且在运行时不存在(运行时只有内存位置)。 C11标准(阅读n1570)提及translation units

也许你梦见了一些homoiconic编程语言。然后不要使用C,而是使用Common Lisp之类的语言。试试SBCL,Common Lisp实现正在将表达式的REPL交互转换(即编译)到机器代码中。

答案 1 :(得分:0)

我尝试了你的代码并发现如果你使用的是64位系统它会显示8个字节,而在32位系统上它会显示4个字节

如果您使用Visual studio,只需将调试设置(我认为?)从x64更改为x86(32位) 应该会给你你的结果。

注意:我在C上是一个非常血腥的初学者,并认为这可能会有所帮助......虽然我真的不知道为什么它在64位系统上是双倍的大小^^“。