2013-12-13 4 views
0
#include <stdio.h> 
#include <stdlib.h> 
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; 
} 

В приведенной выше программе я пытаюсь создать частотную таблицу и играть со значениями ASCII. Проблема в том, что я не проверяю, что значение 0SCASCII находится в диапазоне букв в нижнем регистре, и если я ввожу слово A в plain_char, тогда 65-97 = -32 индекс массива и я его увеличиваю, не должен ли я получить ошибку сегментации? Но программа работает все еще хорошо?Ошибка сегментации

ответ

3

Вы получаете ошибку сегментации только в том случае, если вы находитесь за пределами области памяти, доступной вашей программе, находясь за пределами определенного массива, не означает, что вы находитесь за пределами области памяти вашей программы. Однако он может читать ненужные данные и/или перезаписывать другие части данных вашей программы, а в некоторых случаях даже код вашей программы, который может привести к возможности переполнения буфера.

Конечно, если ваш массив находится в самом начале или конце вашей области памяти, тогда вы получите с ошибкой сегментации. Где массив попадает в память, определяется компилятором и компоновщиком. Аналогично, когда вы находитесь, выход из диапазона вашего массива. Попробуйте, например, char_freq[2^31] Это, вероятно, даст вам ошибку сегментации.

+0

Как я могу узнать, сколько памяти выделено моей программе? – user2688772

+0

@ user2688772 вам все равно. вам нужно только заботиться о явной выделенной памяти. (также мы должны сказать, что процесс вместо программы) –

0

У вас есть неопределенное поведение, означающее, что все может случиться.

3

Ссылкой вне границ массива является неопределенное поведение. Не удивительно, это означает, что поведение программы не определено, все может случиться. Некоторые примеры того, что может случиться:

  • Программа может вылетать и выдавать ошибку сегментации или аналогичную.
  • Программа может выполняться просто отлично.
  • Программа может выполнить, казалось бы, просто отлично и сбой позже.
  • Программа может уничтожить собственные переменные/собственный стек, что приведет к произвольному результату.

И так далее.

+1

+1, но я бы поссорился с вашим «не слишком удивительно». Мой опыт в том, что люди часто очень удивляются просто * как * неопределенным «неопределенным поведением». – ruakh

+0

@ruakh Люди, которые задают такие вопросы, как «как неопределенное поведение, определенное для поведения», должны, вероятно, рассмотреть другую карьеру. Или они найдут себе такой код, как '#if! Определенное поведение behave_as (поведение); # Endif'. – Lundin

Смежные вопросы