~ no hay respuesta en stdout ~ en C

#include #include #include int main() { int a,query,in,n,b[n],sum[a]; sum[1]=0; scanf("%d",&query); for(a=1;a<=query;a++) { scanf("%d",&in); for(n=1;n<=in;n++) { b[n]=1+7*(n-1)+6*(n-1)*(n-2)+(n-1)*(n-2)*(n-3); sum[a]=sum[a]+b[n]; } } for(a=1;a<=query;a++) { printf("%d\n",sum[a]); } return 0; } 

He hecho este código que se ejecuta en la terminal.

Pero en el rango de hackers se está mostrando.

Entrada (estándar)

 2 2 5 

Su salida (stdout)

 ~ no response on stdout ~ 

Rendimiento esperado

 9 225 

Mensaje del comstackdor

 Segmentation Fault 

Ahora, ¿qué debo hacer para resolver el problema.

Sus variables están sin inicializar. Como resultado, su progtwig invoca un comportamiento indefinido .

Por ejemplo, no inicializa n , pero luego declara int b[n] . ¿Cuál es el tamaño de la matriz b ? Nadie sabe realmente, ya que n tiene un valor de basura.

Comience por averiguar cuáles deberían ser los valores de sus variables y luego comience a codificar.


La indexación de matrices comienza desde 0, por lo que sus bucles for no se ven bien.

Cambia esto:

 for(a=1;a<=query;a++) 

a esto:

 for (a = 0; a < query; a++) 
 int main() { int a, query, in, n, *b, *sum; scanf("%d",&query); sum = malloc(query * sizeof(int)); /* do some checks if the malloc was successful */ for(a = 0; a < query; a++) { scanf("%d",&in) ; /* you should check if scan has returned 1 */ b = malloc(in * sizeof(int)); /* and again check against any allocation errors */ for(n = 0; n < in; n++) { b[n] = 1+7*(n)+6*(n)*(n-1)+(n)*(n-1)*(n-2); sum[a] = sum[a] + b[n]; } free(b); } /* the rest */ 

En int a,query,in,n,b[n],sum[a]; , el valor de a no está inicializado y tiene un valor de basura que podría ser cualquier cosa. Este valor se utiliza como el tamaño de la sum matriz de longitud variable. Así que el tamaño de la matriz podría ser cualquier cosa que probablemente no sea lo que quieres.

a podría ser 0 en cuyo caso la sum es una matriz de tamaño 0 que a su vez hará que la sum[1] incorrecta (sería un comportamiento indefinido).

Lo mismo se aplica a n y b[n] .

En el bucle nested, con sum[a]=sum[a]+b[n]; está utilizando sum[a] que no se ha inicializado. Tiene valor basura y el resultado es indeterminado.

Si desea que todos los elementos de sum se inicialicen con 0 , puede hacer

 int sum[20]={0}; 

a la hora de declararlo.

Lo mismo ocurre con b[n]=1+7*(n-1)+6*(n-1)*(n-2)+(n-1)*(n-2)*(n-3); también.

Y la indexación de matrices comienza en 0 . Tal vez podrías usar los bucles como

 for (a = 0; a < query; a++) { 

en lugar de

 for (a = 1; a <= query; a++) 

Si elige el índice de inicio como 0 , el bucle nested interno debería ser como

 for(n=0;n 

Ver demo .

Su problema está en esta línea:

 int a,query,in,n,b[n],sum[a]; 

¿Cuál es el significado de b[n] ? ¿Y de sum[a] ? Suponiendo que le gustaría tener un lenguaje con matrices de crecimiento mágico , C es una mala elección.

En el lenguaje C, los arreglos son una estructura con un tamaño conocido en el momento de la comstackción. De todos modos, supongamos que tu comstackdor admite el horrible truco de los arreglos de longitud variable. Puedes hacerlo:

 #include  #include  #include  int main(void) { int a, query, in , n; scanf("%d", &query); int sum[query+1]; for (a = 1; a <= query; a++) { sum[a] = 0; scanf("%d", &in); int b[in+1]; for (n = 1; n <= in ; n++) { b[n] = 1 + 7 * (n - 1) + 6 * (n - 1) * (n - 2) + (n - 1) * (n - 2) * (n - 3); sum[a] = sum[a] + b[n]; } } for (a = 1; a <= query; a++) { printf("%d\n", sum[a]); } return 0; } 

Tenga en cuenta los cambios: primero debe conocer el tamaño de la matriz y, a continuación, puede asignarla. Además, aumenté el tamaño de la matriz para admitir su elección de comenzar desde 1. Finalmente, también puse a cero el valor inicial para la matriz de sum .