почему gcc печатает "Ошибка сегментации: 11"? - PullRequest
0 голосов
/ 23 января 2019

Когда я запускал ниже программы с использованием компилятора gcc, я в конечном итоге получал "Ошибка сегментации: 11", но когда я запускал то же самое на "https://www.onlinegdb.com/online_c_compiler",, он выполняется совершенно нормально. Я хотел бы знать, почему gcc выдает здесь ошибку сегментации?

#include <stdio.h>

int main(){

    typedef int myArray[10];

    myArray x = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};//Equivalant to x[10]
    myArray y[2]; //equivalant to y[10][2]

    int counter = 0;

    for(int i = 0; i < 10; i++){
        for(int j = 0; j < 2; j++){
            //printf("%i %i\n", i, j);
            y[i][j] = counter++;
        }
    }

    printf("\n\nElements in array x are\n");
    for(int i = 0; i < 10; i++){
        printf("x[%i] = %i\n", i, x[i]);
    }

    printf("\n\nElements in array y are\n");

    for(int i = 0; i < 10; i++){
        for(int j = 0; j < 2; j++){
            printf("y[%i][%i] = %i\t", i, j, y[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Я использую gcc версии 4.2.1. Операционная система: MAC

$gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

1 Ответ

0 голосов
/ 23 января 2019

Комментарий здесь неправильный:

myArray y[2]; //equivalant to y[10][2]

y фактически определяется как:

int y[2][10];

т.е.y имеет 2 строки по 10 int в каждой.

При доступе к y[i][j] с индексом строки i в диапазоне от 0 до 9 и индексом столбца j из0 до 1, вы заканчиваете тем, что обращаетесь к массиву вне границ всякий раз, когда i * ROW_SIZE + j (или i * 10 + j) больше или равен ROW_SIZE * ROW_CNT (или 10 * 2).

ДляНапример, y[9][1] пытается получить доступ ко 2-му значению в 10-й строке.Но в y.

есть только 2 строки. Попытка получить доступ к массиву за пределами имеет неопределенное поведение . Неопределенное поведение означает, что может произойти все что угодно, в том числе кажется, что он работает нормально или сбой.

Чтобы исправить ваш код, определите y следующим образом (чтобы он соответствовал комментарию):

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