Address of array - difference between having an ampersand and no ampersand

后端 未结 4 1031
天命终不由人
天命终不由人 2020-12-11 02:38

I have a struct that looks like this:

struct packet {
  int a;
  char data[500];
};
typedef struct packet packet_t;

I\'m a little confused

4条回答
  •  一整个雨季
    2020-12-11 02:59

    I don't know why this was voted down, it's a good question that exposes a confusing behaviour of C.

    The confusion comes because normally when you define an array a real pointer is created:

    char data[100];
    printf("%p\n", data);    // print a pointer to the first element of data[]
    printf("%p\n", &data);   // print a pointer to a pointer to the first element of data[]
    

    So on a typical 32 bit desktop system 4 bytes are allocated for data, which is a pointer to 100 chars. Data, the pointer, itself exists somewhere in memory.

    When you create an array in a struct no pointer is allocated. Instead the compiler converts references to packet.data into a pointer at runtime but does not allocate any memory for storing it. Rather it just uses &packet + offsetof(data).

    Personally I would prefer the syntax to be consistent and require an ampersand, with packet.data generating some kind of compile time error.

提交回复
热议问题