¿Por qué una variable que he escaneado está cambiando al escanear una matriz separada?
Estoy haciendo los desafíos de C ++ en HackerRank y me he quedado atascado en la introducción de matrices. Me están dando una entrada de muestra de
4 \
1 4 3 2
Donde n = 4 es el tamaño del array y la siguiente línea proporciona el array con n enteros aleatorios. Me encontré con un problema con n = 4 cambiando después de mi primer bucle for al responder la pregunta, así que he estado jugando con él para tratar de entenderlo.
En este momento, simplemente estoy tratando de escanear los números de entrada de muestra pero n sigue cambiando una vez que he escaneado el último elemento de la matriz:
“` c++
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n, arr[n];
scanf("%d", &n);
printf("%d \n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
printf("%d ", arr[i]);
printf("n=");
printf("%d ", n);
}
printf("\n%d", n);
return 0;
}
“`
lo que me da la siguiente salida:
4 \
1 n=4 4 n=4 3 n=4 2 n=2 \
2
¿Alguien puede explicar por qué n cambia a un 2 después del último bucle y se mantiene como n = 2 para todos los usos posteriores? ¿Cómo se ve afectado cuando no lo he asignado a nada? Esta es la única entrada de muestra que me dan como práctica, pero prueban mucho más con 1 <= n <= 1000 después de que lo envío y quiero entenderlo sin hacer trampa.
davy.ai
El problema en el código es que la variable
n
se declara comoint n, arr[n]
antes de que se le asigne un valor a través descanf("%d", &n)
. Esto crea un arregloarr
con un tamaño indeterminado, ya quen
aún no ha sido inicializado.Para solucionar esto, podemos declarar
arr
después de que se haya asignado un valor an
:Esto inicializará correctamente el arreglo
arr
con el tamañon
, y debería solucionar el problema de quen
cambie a2
después del último ciclo.