Pregunta

Tengo problemas para comprender el siguiente código que esperaba crear una matriz en el montón y llenarlo con los caracteres 9 a 0 (sé que podría indexar la matriz como una matriz normal con [] notación para hacer esto, pero lo estoy haciendo de esta manera para tratar de entender los punteros con más profundidad):

int *ptrHeapArray = new int[10]; 

    for(int f=9; f>=0 ;f--)
    {
        *ptrHeapArray = f;
        ptrHeapArray++;
    }
    for(int f=0; f<10; f++)
        cout << ptrHeapArray[f]  << "\n";

Imprime valores completamente inesperados.

Como entiendo lo anterior, el comando 'nuevo' crea una matriz en el montón y me devuelve un puntero a la dirección donde está la matriz. Dado que el puntero que asigno (ptrHeapArray) es de tamaño int, supuse que podría usar el incremento de la publicación del puntero para navegar por la matriz. Sin embargo, los resultados indican que mis suposiciones son incorrectas.

Esto me hizo pensar que quizás el puntero pasado por la palabra clave 'nueva' es solo un puntero a toda la matriz y no se puede usar para recorrer la matriz por alguna razón. Así que intenté crear otro puntero al puntero devuelto por la palabra clave 'nueva' y lo usé para hacer mi población de matriz:

int *ptrHeapArray = new int[10];  //array to hold FRANK data in 32 bit chunks
int *ptrToHeapArrayPointer = ptrHeapArray;

for(int f=9; f>=0 ;f--)
{
    *ptrToHeapArrayPointer = f;
    ptrToHeapArrayPointer++;
}
for(int f=0; f<10; f++)
    cout << ptrHeapArray[f]  << "\n";   

Esto funcionó bien. ¿Alguien puede explicarme por qué tuve que hacer esto y no podría simplemente haber usado el puntero que me pasó respaldado por la palabra clave 'nuevo'?

Gracias

¿Fue útil?

Solución

La línea

ptrHeapArray++;

en el primer bucle for incrementa el puntero, de modo que ya no apunta al comienzo de la matriz.

La línea

int *ptrHeapArray = new int[10];

asigna la memoria para 10 enteros y señala ptrHeapArray al comienzo de esa memoria. En tu bucle for, mueves este puntero. Cuando ptrHeapArray apunta al tercero de los enteros:

[0] [1] [2] [3] [4]
 ^       ^       ^
orig.    |       |
         |       +-- ptrHeapArray[2]
         |
         +-- ptrHeapArray now points here

entonces ptrHeapArray [2] le daría el número entero en la posición originalmente numerada con 4.

Otros consejos

Está modificando el puntero en el código. Después del primer bucle en el primer fragmento, el puntero apuntará al final de la matriz en lugar del principio. Para aclarar las cosas, esto también funcionaría (no se sugiere pero demuestra el comportamiento):

int *ptrHeapArray = new int[10]; 

for(int f=9; f>=0 ;f--)
{
    *ptrHeapArray = f;
    ptrHeapArray++;
}

ptrHeapArray -= 10; // reset the pointer to its original location

for(int f=0; f<10; f++)
    cout << ptrHeapArray[f]  << "\n";

Su ptrToHeapArrayPointer tiene un nombre incorrecto, es solo un int ptr estándar que ha señalado al mismo lugar que ptrHeapArray. Si le cambió el nombre a currentPositionPtr, su código podría tener más sentido para usted.

Cuando haces ptrHeapArray ++, crea ptrHeapArray. Cuando viene a imprimir los datos, ptrHeapArray ya no apunta al inicio de la matriz.

El problema es que en su primer ejemplo, ptrHeapArray se establece inicialmente en el comienzo de la matriz. A medida que recorre su ciclo, aumenta el puntero y, al final del ciclo for, apunta al último elemento de la matriz. Cuando recorre el bucle for para mostrar todos sus valores, está indexando valores más allá del final de la matriz, ya que ptrHeapArray apunta al último elemento de la matriz que asignó.

También es importante recordar, que probablemente debería asegurarse de no perder el puntero original que recibió al usar el nuevo operador para que pueda liberar adecuadamente la memoria asignada en el montón.

En el primer bucle incrementó su puntero ptrHeapArray hasta el final de la matriz. Entonces, después de ejecutar el primer bucle for, el puntero apunta al final de la matriz y no al comienzo. Por lo tanto, cuando intenta imprimir el contenido de la matriz, está accediendo a asignaciones de memoria no válidas y el comportamiento será inesperado. En el segundo caso, está tomando una copia de su dirección de inicio antes de asignar valores a la matriz. Entonces, cuando intente imprimir el contenido utilizando la copia, estará apuntando al comienzo de la matriz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top