相关疑难解决方法(0)

结构中成员的顺序是否重要?

我在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 []'.

这是为什么?

c struct

74
推荐指数
4
解决办法
8540
查看次数

符合旧"struct hack"(?)的变体

我相信我已经找到了一种方法来实现便携式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)

c c89

13
推荐指数
1
解决办法
820
查看次数

在c中访问数组的-1元素

我有一个结构数组,它是动态分配的.指向此数组的指针将传递给其他函数.

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]什么?

这是我能做的吗?我如何访问初始结构?

c arrays struct pointers dynamic

5
推荐指数
1
解决办法
173
查看次数

标签 统计

c ×3

struct ×2

arrays ×1

c89 ×1

dynamic ×1

pointers ×1