C - 不能将我的sizeof实现用作数组大小

时间:2015-06-04 13:22:40

标签: c

我实施了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  

4 个答案:

答案 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所需的字节数。这可能不是你通常想要的。但我知道它是否仅仅是一项比较练习。