c - 类型 :C 的打印尺寸

标签 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

最佳答案

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 )。没有 eval operator在标准 C 中。

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

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

请注意,在 C(和 C++)中,类型、语句、表达式、变量名称等仅供编译器使用,在运行时不存在(运行时只有内存位置)。 C11标准(阅读 n1570 )提到 translation units .

也许你梦想着一些homoiconic编程语言。然后不要使用 C,而是像 Common Lisp 这样的语言.尝试 SBCL ,Common Lisp 实现在每个 REPL 处进行转换(即编译)将您的表达式与机器代码交互。

关于c - 类型 :C 的打印尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47257682/

相关文章:

常见的 pre-C89 编译器/stdlib 习语(1985-1988)

在c中调用一个函数以在另一个函数调用中返回一个字符串

c++ - 我们如何知道自从我们按下计算机上的电源按钮以来已经过去了多长时间?

C 读取由空格分隔且字长不受限制的文本文件

c - 测试文件/目录是否只读

c - C中的队列实现程序

在 C 中创建一个新字符串以在大型库 (GLib) 中使用,而不使用 fprintf

c - C中字符串数组的数组

const int 不占空间?

c - 插入排序错误