que punteros puntero programacion para informatica aritmetica apuntador c pointers struct pointer-arithmetic

punteros - que es un puntero en c



Aritmética del puntero para las estructuras (4)

Dada una definición de estructura que contiene una doble y tres variables int (4 variables en total), si p es un puntero a esta estructura con un valor de 0x1000, ¿qué valor tiene p ++?

Este no es un problema de tarea, así que no te preocupes. Solo estoy tratando de prepararme para una prueba y no puedo resolver este problema de práctica. Gracias

Esto está en C. Sí, quiero el valor de p después de que se incrementa. Esta es una máquina de 32 bits


La aritmética del puntero se realiza en unidades del tamaño del tipo de puntero.

Entonces, si haces p++ en un puntero a tu estructura, p avanzará en sizeof *p bytes. es decir, solo pregúntale a tu compilador qué tan grande es tu estructura con el operador sizeof .


La respuesta es que es al menos

sizeof(double) + (3*sizeof(int))

La razón por la cual es "al menos" es que el compilador es más o menos libre de agregar relleno según sea necesario por la arquitectura subyacente para que se adapte a las restricciones de alineación.

Digamos, por ejemplo, que tiene una máquina con una palabra de 64 bits, como una máquina vieja de CDC. (Diablos, algunos de ellos tenían palabras de 60 bits, por lo que sería aún más extraño.) Supongamos además que en esa máquina, sizeof(double) es de 64 bits, mientras que sizeof(int) es de 16 bits. El compilador luego puede diseñar su estructura como

| double | int | int | int | 16 bits padding |

para que toda la estructura se pueda pasar a través de la máquina en 2 referencias de memoria, sin necesidad de cambiar ni molestar. En ese caso, sizeof (yourstruct_s) sería 16, donde sizeof(double)+ (3*sizeof(int)) es solo 48 14.

Actualizar

Observe que esto también podría ser cierto en una máquina de 32 bits: entonces podría necesitar un relleno para acomodarlo en tres palabras. No sé de una máquina moderna que no se dirija al byte, por lo que puede ser difícil encontrar un ejemplo ahora, pero un montón de arquitecturas antiguas lo necesitarían.


struct foobar *p; p = 0x1000; p++;

es lo mismo que

struct foobar *p; p = 0x1000 + sizeof(struct foobar);


p = p + sizeof(YourStruct)

El compilador puede decidir libremente qué tamaño devolverá si no desactiva el relleno.