Передача массивов функциям по их именам в C - PullRequest
0 голосов
/ 14 декабря 2010

Я объявляю глобальную переменную в моей программе:

double mat[3200][3200];

при передаче этого массива в fwrite () с использованием имени переменной в качестве аргумента, я получаю переполнение стека во время выполнения.

fwrite(mat, sizeof(double), 3200*3200, fid);

Почему это?Разве компилятор не должен заменить переменную mat указателем на ее первый элемент?

Я прочитал здесь и здесь , и до сих пор не могу понять.

Ответы [ 3 ]

1 голос
/ 14 декабря 2010

Массив создается в стеке?Например, вы создаете массив следующим образом?

void foo()
{ 
  double mat[3200][3200];

  // ... other stuff

  fwrite(mat, sizeof(double), 3200*3200, fid);
}

Если это так, вы уверены, что именно fwrite, а не само объявление массива вызывает переполнение стека?Массив занимает 3200 *3200* 8 = 81920000 байт (около 78 МБ), вероятно, слишком большой для размещения в стеке.Попробуйте вместо этого malloc использовать массив.

1 голос
/ 14 декабря 2010

Ошибка переполнения стека может быть вызвана либо бесконечной рекурсией (маловероятно в вашем примере), либо слишком большим объемом данных, передаваемых в стек (параметры). Кажется, ваш массив передается по копии, а не по адресу.

Вы можете попробовать заменить звонок на

fwrite(&(mat[0][0]), sizeof(double), 3200*3200, fid);

Статический массив не является указателем.

0 голосов
/ 15 декабря 2010

Я предполагаю, что переменная была передана (используя стек) по значению. Спасибо всем, кто пытался помочь мне разобраться в этом.

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