Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: angeljonh en 20 Agosto 2017, 02:16 am



Título: Arreglos
Publicado por: angeljonh en 20 Agosto 2017, 02:16 am
Tengo una duda con un arreglo, porque el iterador me da 4, a que se debe, AYUDA?

Código:
//Arreglo/error.cpp/
#include <iostream>

using std::cout;
using std::endl;

int main(void){

    int i=0;
    int arreglo[3]={3,3,3};
    arreglo[i++]=1;
    arreglo[i++]=2;
    arreglo[++i]=4;
    cout<<"arreglo[0]= "<<arreglo[0]<<endl;
    cout<<"arreglo[1]= "<<arreglo[1]<<endl;
    cout<<"arreglo[2]= "<<arreglo[2]<<endl;
    cout<<"iterador i= "<<i<<endl;
    return 0;
}


Título: Re: Arreglos
Publicado por: ivancea96 en 20 Agosto 2017, 13:04 pm
'i' debería darte 3. Si da 4, es por el error que te comento ahora:

La tercera vez que asignas al arreglo ese 4, pusiste ++i. Por tanto, estás asignando a la posición 3 en vez de a la 2. Tienes que poner "i++" o "i" asecas ahí. "++i" incrementa primero, con lo que sale del array.

El por qué de que 'i' te de 4 se debe a que la variable 'i' puede estar colocada justo después del array en memoria. Por tanto, al acceder a arreglo[3], estás accediendo sin querer a 'i'. Esto es algo dependiente del compilador, así que simplemente corrige el problema y nunca accedas a un array fuera de sus límites.


Título: Re: Arreglos
Publicado por: angeljonh en 20 Agosto 2017, 18:05 pm
Como el arreglo es memoria contigua, probablemente el compilador asigna la variable e inmediatamente después del arreglo, por lo tanto al acceder a esa dirección de memoria con el arreglo[3]=4(invalido), accede al valor de i y por eso te muestra eso u otra razón podría ser que la memoria que viene justo después del arreglo[2], el SO te la haya asignado al programa, por lo tanto la puedes manejar aunque estés fuera de los índices de tu arreglo.


Título: Re: Arreglos
Publicado por: ivancea96 en 20 Agosto 2017, 18:07 pm
Mmm? Te estás auto-respondiendo? No entiendo el comentario xD


Título: Re: Arreglos
Publicado por: angeljonh en 20 Agosto 2017, 18:16 pm
asi es ya verifique mi duda, gracias a todos