Sin falla de segmentación

#include  #include  int main(int argc, char *argv[]) { int char_freq[26] = {0}; int i = 'a'; int plain_char = getchar(); while(plain_char != EOF) { char_freq[plain_char-'a']++; plain_char = getchar(); } while(i <='z') { printf("%c %d \n",i,char_freq[i-'a'] ); i++; } return EXIT_SUCCESS; } 

En el progtwig anterior, estoy tratando de hacer una tabla de frecuencias y jugar con valores ASCII. El problema es que no estoy comprobando que el valor ASCII de plain_char esté en el rango de las letras minúsculas y si ingrese el valor A en plain_char entonces 65-97 = -32 índice de matriz y lo incremento, ¿no debería 65-97 = -32 un fallo de segmentación? Pero el progtwig sigue funcionando bien?

Solo obtiene una falla de segmentación cuando está fuera del área de memoria permitida para su progtwig, estar fuera de una matriz definida no significa que esté fuera del área de memoria de su progtwig. Sin embargo, puede leer datos no deseados y / o sobrescribir otras partes de los datos de su progtwig, o en ciertos casos, incluso el código de su progtwig que podría generar oportunidades de ataque por desbordamiento de búfer.

Por supuesto, si su matriz se encuentra al principio o al final de su área de memoria, entonces obtendría una falla de segmentación. El comstackdor y el vinculador determinan dónde se coloca la matriz en la memoria. Similar cuando estás lejos, fuera de tu rango de arreglo. Pruebe, por ejemplo, char_freq[2^31] Eso probablemente le dará una falla de segmentación.

Escribir fuera de los límites de una matriz es un comportamiento indefinido. No demasiado sorprendente, esto significa que el comportamiento del progtwig no está definido, cualquier cosa puede suceder . Algunos ejemplos de lo que podría pasar:

  • El progtwig podría fallar y producir una falla de segmentación o similar.
  • El progtwig podría ejecutarse bien.
  • El progtwig podría ejecutarse aparentemente bien y fallar más tarde.
  • El progtwig podría destruir sus propias variables / su propia stack, dando lugar a cualquier resultado aleatorio.

Y así.

Aquí tienes un comportamiento indefinido, lo que significa que todo puede suceder.