Foro de elhacker.net

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).

Código
  1. int arreglo[4];
  2.  
  3. if(arreglo == &arreglo) { // Siempre me da 'true'
  4.    ...
  5. }

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
  1. arreglo + 1
Y
Código
  1. &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
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:

Código
  1. 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:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int array[8];
  6.    int n = *(&array + 1) - array;
  7.    printf("Size array = %d\n", n); //Debe imprimir 8
  8.  
  9.    return 0;
  10. }
  11.  
  12.  


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