Ошибка сегментации и повреждение памяти с указателем на массив указателей - PullRequest
0 голосов
/ 15 сентября 2011

Целью здесь является указатель, который работает как двумерная матрица. Я протестировал следующий фрагмент кода для создания указателя и массива целочисленных указателей. Он компилируется и работает нормально. (Это упрощенная версия, я попытался присвоить / напечатать значения для mymatrix[x][y], и она отлично работает.)

#include <iostream>
int **mymatrix;

int main(int argc, char* args[]){

  mymatrix = new  int*[100] ;
  for( int n = 0; n <= 100; n++ ){
    mymatrix[n] = new int[200] ;
  }
  return 0;
}

Однако, как только я скопирую этот фрагмент в другой код (который ранее работал нормально), код все еще компилируется, но не запускается. Нет ошибок или предупреждений, связанных с этим фрагментом. Это странно, потому что mymatrix еще даже не взаимодействует с остальным кодом (после определения он никогда больше не используется).

Фактическая ошибка, которая прерывает выполнение, варьируется от сбоя при попытке загрузить шрифт, Segmentation Fault при попытке присвоить значение и Memory Corruption (с огромным выводом журнала того, что я считаю потоками).

Я мог бы вставить разделы большего кода, но я почти уверен, что все это происходит, потому что я не определяю этот указатель надлежащим образом. Я делаю что-то неуклюжее или небезопасное? Или я должен начать просматривать остальную часть моего кода на наличие ошибок?

1 Ответ

2 голосов
/ 15 сентября 2011
for( int n = 0; n <= 100; n++ )

Это вызывает переполнение массива. mymatrix [100] не является частью массива mymatrix. Результат записи в него не определен. Причина, по которой он «работает нормально» сам по себе, заключается в том, что нет других структур данных, которые вы могли бы использовать. Цикл for должен начинаться с.

for( int n = 0; n < 100; n++ )

Как правило, использование <= in для условий цикла не является идиоматическим c. Если вы обнаружите, что используете его, вам следует спросить себя, действительно ли вы поступаете правильно. Переполнения массива иногда трудно найти. Если вы используете Linux, вы можете использовать такой инструмент, как <a href="http://valgrind.org/" rel="nofollow"> valgrind , чтобы помочь вам идентифицировать эту и другие ошибки.

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