Come esperto non C/C++ ho sempre considerato parentesi quadre e matrici di puntatori come uguali.Qual è la differenza tra array di parentesi quadre e array di puntatori?
cioè:
char *my_array_star;
char my_array_square[];
Ma ho notato che quando l'uso in una struttura/classe tuttavia non si comportano allo stesso:
typedef struct {
char whatever;
char *my_array_star;
} my_struct_star;
typedef struct {
char whatever;
char my_array_square[];
} my_struct_square;
La riga sotto visualizza 16, whatever
prende 1 byte, my_array_pointer
richiede 8 byte. causa l'imbottitura la dimensione totale struttura è 16.
printf("my_struct_star: %li\n",sizeof(my_struct_star));
La riga sotto visualizza 1, whatever
richiede 1 byte, my_array_pointer
non viene preso in considerazione.
printf("my_struct_square: %li\n",sizeof(my_struct_square));
Giocando intorno ho notato che le parentesi quadre sono usate come spazio in più nella struttura
my_struct_square *i=malloc(2);
i->whatever='A';
i->my_array_square[0]='B';
il colpo riga mostra A:
printf("i[0]=%c\n",((char*)i)[0]);
la linea colpo display B:
printf("i[1]=%c\n",((char*)i)[1]);
Così ho
non posso dire più che le parentesi quadre sono uguali ai puntatori. Ma mi piacerebbe capire la ragione di questo comportamento. Ho paura di perdere un concetto chiave di quelle lingue.
In C non è possibile dichiarare 'qualcosa []' e si deve definire la dimensione dell'array. Scegli tra i due. – Eregrith
@Eregrith: tu * puoi * dichiarare tale array alla fine di una struct, ed è per questo che compila. –
Continuerò a usare il puntatore per gli array creati dinamicamente e non mi preoccupo. Non mi piace quell'altra sintassi, mi sembra offensivo. – evanmcdonnal