Dynami c 2d-array - отсутствует ошибка сегментации? - PullRequest
1 голос
/ 04 августа 2020

У меня есть следующий код:

int **a = new int*[n+1];
for(int i = 0; i <= n; i++) a[i] = new int[1];

Теперь - насколько я понимаю - первый оператор выделяет память для n + 1 указателей int, в l oop, для каждого из этих указателей int там Выделена память 1 * sizeof (int) (a [i] - указатель на первое int).

Если я выведу массив в 2 цикла от i = 0 до n, это не приведет к ошибке сегментации :

    for(int i = 0; i <= n; i++) {
      for(int j = 0; j <= n; j++)
         printf("%d ",a[i][j]);
      printf("\n");
   }

Почему я могу получить доступ к [i] [j], где j> 0, поскольку я выделил память только для одного int, не получая ошибки сегментации?

1 Ответ

4 голосов
/ 04 августа 2020

Ваш код имеет неопределенное поведение .

При создании массивов ваш l oop выделяет массив int[1] для каждого указателя int* во внешнем массиве. Это нормально.

При доступе к массивам позже, доступ к указателям int* через a[i] нормален, поскольку i не go выходит за пределы массива a[]. Но [j] выходит за пределы go, поскольку 0 - единственный индекс, который действителен для доступа к элементу массива int[1].

Неопределенное поведение не гарантирует что произойдет segfault. В этом случае отсутствие segfault просто означает, что адреса памяти, к которым вы обращаетесь через недопустимые индексы , просто случаются , чтобы быть действительными в адресном пространстве вашей программы, но они недействительны в границах массивы. Таким образом, вы в конечном итоге распечатываете случайный мусор из окружающей памяти.

...