我实施了sizeof as recommended。当我想打印变量的大小时它工作正常,但我不能将它用作数组大小。
这是代码:
#include <stdio.h>
#include <stdlib.h>
#define my_sizeof(var) (size_t)((char *)(&var+1)-(char*)(&var))
int s = 7;
void main()
{
int arr[sizeof(s)]; //works OK
int arr2[my_sizeof(s)];//error
printf("%d\n", my_sizeof(s));//works OK
int temp = 0;
}
Error 1 error C2057: expected constant expression
Error 2 error C2466: cannot allocate an array of constant size 0
Error 3 error C2133: 'arr2' : unknown size
答案 0 :(得分:6)
您的实现my_sizeof
并不完全等同于C中的sizeof
运算符,它是一个编译时运算符,而您的运算符只能在运行时计算大小。
所以,
int arr[sizeof(s)];
声明一个大小为sizeof(s)
的数组,而
int arr2[my_sizeof(s)];
执行相同的操作,但数组大小不是在编译时计算的,而是在运行时计算的。为了实现这一点,您需要C99 VLAs的支持,您的编译器不支持并且错误输出。
答案 1 :(得分:2)
定义时
int arr[sizeof(s)];
编译器在进入函数后立即在堆栈中分配其大小,然后它需要一个可以在编译时评估而不是运行时间的常量表达式(这可以在C99中更改)。使用my_sizeof,您正在使用必须在运行时解决的指针算法。
如果使用my_sizeof()
malloc()
答案 2 :(得分:2)
告诉您,您需要区分编译时间和运行时间。这两个概念在C世界中是截然不同的。
例如,以下代码有效,因为它在编译期间获得大小:
typedef struct {
char[sizeof(s)] chars;
} anon_struct;
但是,以下内容无效,因为大小在运行时未知且VLA不支持在组合类型定义中:
typedef struct {
char[my_sizeof(s)] chars;
} anon_struct;
建议你买一本好的教科书并阅读好。
答案 3 :(得分:0)
gcc可以在Ubuntu上编译它。您看到的问题可能是由于编译时尚未知道的地址。但是,它将在运行时被人知道,所以它看起来像gcc做了什么才能使这项工作&#34;在引擎盖下#34;。但我收集你的编译器是基于MS的。
我应该补充一点,编译的行将为arr分配一些int,其数量等于一个int所需的字节数。这可能不是你通常想要的。但我知道它是否仅仅是一项比较练习。