我正在用C语言创建一个动态数组,我还想创建一个函数,该函数用一定数量的元素初始化给定的动态array.但是,在确定内存分配的每个元素的大小时,我不知props 体要做什么.

以下是我的代码:

#define typedef_list(name, type)    \
        typedef struct {            \
                int cap;            \
                int n;              \
                type *items;        \
        } name;                                                                                             

#define list_init(list, cap)                                                              \
        do {                                                                              \
                list.items = malloc(cap * sizeof(*list.items));   /* problem line */  \
                list.cap = cap;                                                        \
        } while (0);

#endif

我使用sizeof(*list.items)来获取所指向的任何对象的大小.它似乎起作用了,因为以下宏对给定类型起作用:

#define list_test(list) do { printf("%lu\n", sizeof(*(list.items))); } while(0);

这样做可以接受吗,因为从技术上讲,内存还没有分配?我的猜测是,编译器并没有试图访问该内存,而只是"知道"内存的大小,但是这样可以吗?

编辑-以下是我用来测试这一点的代码:

typedef_list(dyn, uint16_t);  // works with any given type

int main(void) {
        dyn arr; 
        list_test(arr);
}

推荐答案

为了回答这个特定的问题:是的,即使还没有分配list.items,写入sizeof(*(list.items))也是可以的,因为sizeof的结果只取决于操作数的类型,并且除非它是可变长度数组类型(在这种情况下不能是可变长度数组类型),否则不计算操作数.

这在C17标准6.5.3.4-2中有所规定:

运算符sizeof产生其操作数的大小(以字节为单位),该操作数可以是一个表达式或 带括号的类型名称.大小由操作数的类型确定.结果 是一个整数.如果操作数的类型是可变长度数组类型,则计算该操作数; 否则,不计算操作数,结果为整型常量.

事实上,要获得类型为T的 struct 的 struct 成员M的大小而不具有 struct 的实例,一般方法是将sizeof与类型T *的空指针一起使用,如下所示:

#define sizeofMember(T, M) sizeof(((T *) 0)->M)

C++相关问答推荐

gcc已编译的可执行文件TSB是否同时暗示最低有效字节和最低有效位?

C中空终止符后面的数字?

为什么下面的C代码会进入无限循环?

字符串令牌化xpath表达式

变量>;-1如何在C中准确求值?

Can函数指针指向C++中具有不同参数连续性的函数

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

轮询libusb_pollfd struct 列表的正确方式是什么?

GCC不顾-fno-Builtin-SINCOS旗帜向SINCOS发出呼唤

如何在下面的C代码中正确管理内存?

CGO:如何防止在使用CGO在包中包含C头文件时出现多个定义...&q;错误?

Caesar密码调试:输出文本末尾的问号和随机字符

使用ld将目标文件链接到C标准库

Wcstok导致分段故障

链接器脚本和C程序使用相同的头文件,这可能吗?

将非连续物理内存映射到用户空间

表达式x&;&;(~x)应该返回1还是0?它依赖于编译器吗?

如何使用WRITE()以指针地址的十六进制形式写入标准输出

%g浮点表示的最大字符串长度是多少?

使用邻接表创建图