我在C中发现了一种奇特的行为.请考虑以下代码:
struct s {
int a;
};
struct z {
int a;
struct s b[];
};
int main(void) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它编译得很好.然后z像这样改变struct成员的顺序
struct z {
struct s b[];
int a;
};
Run Code Online (Sandbox Code Playgroud)
突然间,我们得到了编译错误field has incomplete type 'struct s []'.
这是为什么?
我相信我已经找到了一种方法来实现便携式C89中众所周知的"struct hack".我很好奇这是否真的严格符合C89.
主要思想是:我分配足够大的内存来保存初始结构和数组元素.确切的大小是(K + N) * sizeof(array_base_type),K选择的位置是K * sizeof(array_base_type) >= sizeof(the_struct)和N数组元素的数量.
首先,我取消引用malloc()返回存储的指针the_struct,然后使用指针算法获取指向结构后面的数组开头的指针.
一行代码值超过一千字,所以这里是一个最小的实现:
typedef struct Header {
size_t length;
/* other members follow */
} Header;
typedef struct Value {
int type;
union {
int intval;
double fltval;
} v;
} Value;
/* round up to nearest multiple of sizeof(Value) so that a Header struct fits in */
size_t n_hdr = (sizeof(Header) + sizeof(Value) - 1) / sizeof(Value); …Run Code Online (Sandbox Code Playgroud) 我有一个结构数组,它是动态分配的.指向此数组的指针将传递给其他函数.
struct body{
char* name;
double mass;
// ... some more stuff
};
body *bodies = malloc(Number_of_bodies*sizeof(body));
Run Code Online (Sandbox Code Playgroud)
我需要知道数组的大小,所以我将大小存储在其中一个结构中,它位于数组的第0个元素(第一个结构)中.
bodies[0].mass = (double)Number_of_bodies;
Run Code Online (Sandbox Code Playgroud)
然后我从函数返回一个指向数组的第一个元素的指针,即 bodies[1]
return (bodies+1);
Run Code Online (Sandbox Code Playgroud)
现在,当我在其他函数中使用此指针时,数据应该从第0个元素开始.
body *new_bodies = (bodies+1); //Just trying to show what happens effectively when i pass to another function
new_bodies[0] = *(bodies+1); //I Think
Run Code Online (Sandbox Code Playgroud)
如果我想看到初始结构,那是bodies[0]什么意思,在我必须访问的其他函数中意味着new_bodies[-1]什么?
这是我能做的吗?我如何访问初始结构?