C программой - разное поведение на разных машинах. Проблема с выделением памяти? - PullRequest
3 голосов
/ 15 сентября 2011

У меня есть программа на C, которая дает разные результаты при запуске на двух машинах.

На первой машине (Linux Ubuntu, компилятор gcc v 4.4.3, 64-битная память, 4 ГБ) она работает нормально и дает разумные результаты (фактически это машина, на которой она в основном разрабатывалась).

На втором компьютере (Mac OSX 10.5.8, компилятор gcc v 4.4.5, 32-битная память, 2 ГБ) результаты выглядят бессмысленными.

В частности, существует массив A, заполненный во время цикла FOR, в котором каждый член A [i] зависит от A [i-1]. Я обнаружил, что после примерно 4000 шагов моя машина начинает забывать значения A [i-1], а затем вычисляет ерунду.

Еще более странно для меня проблема исчезнет, ​​если в начальный список объявления переменных функции я добавлю еще один фиктивный массив, который я даже не использую в программе.

То есть код с заголовком вроде

...
double X[n_max];           
double Y[n_max]; 
double A[n_max]; 
...

работает, а

...
double X[n_max];           
// double Y[n_max]; 
double A[n_max]; 

нет.

Полагаю, в распределении памяти есть какая-то проблема, и когда я выделяю память для фиктивного массива Y, беспорядок просто перемещается в другое место.

Я не понимаю ни того, почему у моего Mac нет проблем с перезаписью данных, которые он должен помнить, ни почему эта же программа работает на компьютере с Linux.

Я надеюсь, что проблема ясна, любая помощь приветствуется. Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Во-первых, у вас наверняка есть ошибка в вашей программе, и повышение уровня предупреждений компилятора или запуск с использованием valgrind может помочь найти ее.

Структура памяти, естественно, отличается, из-за разных компиляторов иАрхитектура ЦП, я думаю, что проблема связана с 64-битной и 32-битной архитектурой (влияние на размеры указателя, выравнивание памяти и т. Д.).

2 голосов
/ 15 сентября 2011

Что ж, очевидно, что один из массивов X [] или A [] индексируется вне границ. Как тест, замените все индексы массива на unsigned или size_t, перекомпилируйте и запустите под отладчиком. Программа, вероятно, будет segfault.

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