Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: class_OpenGL en 4 Junio 2016, 18:40 PM

Título: [C](Consulta) Pregunta sobre si una característica es de ANSI C (sobre arreglos)
Publicado por: class_OpenGL en 4 Junio 2016, 18:40 PM
Hola. Quería preguntar si el hecho de que un arreglo se apunte a si mismo es coincidencia o es una característica de ANSI C, es decir, la dirección del arreglo y la dirección a la que apunta el arreglo es la misma (al menos eso me pasa con MinGW-w64).

int arreglo[4];

if(arreglo == &arreglo) { // Siempre me da 'true'
    ...
}


Gracias
Título: Re: [C](Consulta) Pregunta sobre si una característica es de ANSI C (sobre arreglos)
Publicado por: geeke en 4 Junio 2016, 19:46 PM
No es coincidencia el estándar garantiza que arreglo y &arreglo siempre apuntaran a la misma dirección (el primer elemento del array) pero tienen tipos diferentes no es lo mismo hacer

Código (cpp) [Seleccionar]
arreglo + 1
Y
Código (cpp) [Seleccionar]
&arreglo + 1
Título: Re: [C](Consulta) Pregunta sobre si una característica es de ANSI C (sobre arreglos)
Publicado por: class_OpenGL en 4 Junio 2016, 21:27 PM
En 32 bits sí que sería lo mismo XDD

En 64 bits no, pues la primera se incrementa en 4 y la segunda en 8 :P

Gracias :D
Título: Re: [C](Consulta) Pregunta sobre si una característica es de ANSI C (sobre arreglos)
Publicado por: geeke en 5 Junio 2016, 23:14 PM
Cita de: class_OpenGL en  4 Junio 2016, 21:27 PM
En 32 bits sí que sería lo mismo XDD

En 64 bits no, pues la primera se incrementa en 4 y la segunda en 8 :P

Gracias :D

Supongamos el siguiente arreglo:

int arreglo[8];

arreglo es de tipo int* un puntero al primer elemento de arreglo
&arreglo es de tipo int (*)[8] un puntero a un arreglo de 8 enteros

Por lo tanto si hacemos arreglo + 1 incrementara 4 bytes (suponiendo int == 4 bytes) pero &arreglo + 1 sabiendo que es un puntero a arreglo de 8 ints el incremento sera 4 * 8 = 32 saltamos 8 bytes justo despues del final de arreglo. Puedes comprobar esto haciendo:

#include <stdio.h>

int main()
{
    int array[8];
    int n = *(&array + 1) - array;
    printf("Size array = %d\n", n); //Debe imprimir 8

    return 0;
}

Título: Re: [C](Consulta) Pregunta sobre si una característica es de ANSI C (sobre arreglos)
Publicado por: class_OpenGL en 5 Junio 2016, 23:17 PM
Ups. No consideré el tamaño del arreglo... qué despiste el mío XDD Gracias por la aclaración