где ошибка этого кода C - PullRequest
0 голосов
/ 09 июля 2010

Мне сказали, что это ошибочный код, но я не знаю почему, некоторые могут объяснить это мне. почему при компиляции не будет массива вне связанного исключения?

int a[10];
int j;

void main () {
    int i, j = 42;
    for (i = 0; i <=10; i++) a[i] = i;
    printf("%d", j);
}

Ответы [ 5 ]

27 голосов
/ 09 июля 2010

Вы выделили 10 пробелов.Вы заполняете 11.

6 голосов
/ 09 июля 2010

Изменить

int a[10];

на

int a[11];

или

for (i = 0; i <=10; i++) a[i] = i;

на

for (i = 0; i < 10; i++) a[i] = i;

Вы создали массив ссчитать 10 и попытаться положить 11 элементов в нем.Вам нужно добавить в него только 10 элементов или создать массив большего размера.

1 голос
/ 10 июля 2010

заполнение массива, пересекающего границу ... a [10] неверно.

1 голос
/ 09 июля 2010

Вот одна ошибка:

void main () {

должно быть

int main (int argc, char** argv) {

Еще одна ошибка в вашем цикле.Вы пишете после конца массива a, и если ваш компилятор поместил j в память сразу после a (что, как я полагаю, зависит от вашего вопроса), тогда доступ к массиву за пределами допустимого диапазона фактически завершитсядо присвоения значения j.Следовательно, когда вы записываете 10 в a[10] (которого не существует), вы записываете его в память, где живет j (в результате чего это действует как j = 10).Однако это поведение зависит от того, как ваш компилятор размещает переменные в памяти, поэтому вы можете очень хорошо увидеть другое поведение, если вы скомпилировали одну и ту же программу на другой платформе.

0 голосов
/ 09 июля 2010

Не должно быть переполнения массива, это правильно, как вы упомянули в своем вопросе. Но некоторые компиляторы выдают PASS с кодом, тогда как другие вызывают предупреждение (или ошибка повышена).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...