¿Por qué me sale la falla de segmentación en C?

¿Por qué esta pregunta no es duplicada? El problema no puede ser en scanf , ya que es dado por el hackerrank y no puedo modificar el código! Además, los casos de prueba son automatizados, dados por hackerrank. Podemos confiar en ellos con la lectura de entrada. Hay un error en mi lógica de encontrar dos elementos en una matriz, aunque no podría encontrarlo: |

Nota: No puedo modificar el método main , como se mencionó anteriormente. Re-iterándolo. ¿Por qué no puedo modificar? Es porque el método está dado por el portal. No puedo cambiarlo Lee la entrada y llama a mi método a través de algunos scripts automatizados, no tengo control sobre él. Entonces, por favor, no me digas que modifiques el método main .

Estaba probando algunos problemas de práctica en hackerrank en lenguaje C y algunos de los casos de prueba comenzaron a lanzar una Segmentation fault por el siguiente problema. He intentado entenderlo durante más de 2 horas y no se me ocurre ningún caso de prueba que segmentation fault . Estoy atascado: |

Planteamiento del problema:

Dada una matriz y un número. Encuentra si hay 2 elementos en la matriz, cuya sum es igual al número dado. Si el número está presente, devuelva 1, de lo contrario 0.

Bastante fácil, ¿eh? Pensé lo mismo y lo codifiqué como sigue,

 int compFunc (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); } int isSumPossible(int a[], int L, int N ){ /*L: Length of the array */ if(a==NULL) return 0; if(L<=1) return 0; int left=0, right=L-1; qsort(a,L,sizeof(int),compFunc); while(left<right) { if(a[left]+a[right]==N) return 1; else if(a[left]+a[right]<N) left++; else right--; } return 0; } int main() //given by hackerrank, I can't modify main method { int N; scanf("%d", &N); //fixed &N - it was correctly given in code, I missed it while typing it here. int a[100004], i=0; //read input into array a, based on N int x;scanf("%d", &x); //fixed &x - it was correctly given in code, I missed it while typing it here. printf("%d", isSumPossible(a,N,x)); } 

Por favor, supongamos que todos los archivos de encabezado necesarios están incluidos. Ahora, cuando ejecuté el código, la mayoría de los casos de prueba pasaron y para algunos casos de prueba mostraron una Segmentation fault . Desafortunadamente, los casos de prueba no son visibles para mí: | He revisado mi código más de 10 veces y no entiendo en qué escenario obtendría una Segmentaion fault . ¿Alguien puede ayudarme a comprender qué escenario me falta en mi código y por qué veo un error de segmentación?

El problema está en el scanfs en la parte principal del código.

Si nos fijamos en la documentación, la descripción de la función dice:

Lee los datos de la entrada estándar y los almacena de acuerdo con el formato del parámetro en las ubicaciones señaladas por los argumentos adicionales.

Esto significa que debe asignarle una dirección de memoria para escribir datos. Al agregar & a las dos variables enteras en su problema principal, se soluciona el problema.

 int main() { int N; scanf("%d", &N); int a[100004], i=0; //read input into array a, based on N int x;scanf("%d", &x); printf("%d", isSumPossible(a,N,x)); }