Странное поведение кода? - PullRequest
2 голосов
/ 31 марта 2010

У меня есть C-код, в котором у меня есть объявление структуры, в котором объявлен массив int [576].

По какой-то причине мне пришлось удалить этот массив из структуры, поэтому я заменил этот массив указателем как int * ptr; объявил некоторый глобальный массив того же типа где-то еще в коде и инициализировал этот указатель, назначив глобальный массив этому указателю. Поэтому мне не нужно было менять способ доступа к этому массиву из других частей моего кода.

Но он работает нормально / дает желаемый результат, когда у меня есть массив, объявленный в структуре, но он дает нежелательный вывод, когда я объявляю его как указатель в структуре и назначаю глобальный массив этому указателю, как часть инициализация указателя.

Весь этот код выполняется на MS-VC 6.0 / Windows setup / Intel-x86.

Я попробовал следующие вещи:

  1. Предполагается, что структура дополнения / выравнивания, но не может получить какие-либо провода? Если вообще структура может быть причиной, как я могу приступить к сужению и подтверждению?

  2. Я убедился, что в обоих случаях массив инициализируется некоторыми значениями по умолчанию, скажем, 0 до его первого использования, и он не используется до инициализации.

  3. Я попытался использовать глобальный массив, а также память на основе malloc для этого вновь объявленного массива. Тот же результат, нежелательный вывод.

Как я могу сосредоточиться на проблеме? Любые указатели будут полезны.

Ответы [ 3 ]

3 голосов
/ 31 марта 2010

Возможно ли, что вы используете sizeof где-нибудь в поле структуры?sizeof(int[576]) != sizeof(int*).

Это должно быть единственное видимое различие между ними.

3 голосов
/ 31 марта 2010

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

1 голос
/ 31 марта 2010

Вы говорите, что вам не нужно было менять способ доступа к этому массиву. Но есть некоторые операции, которые имеют разные результаты для массивов и указателей. Один из них - уже упомянутый sizeof (struct.arr) и sizeof (struct.ptr), другой - & struct.arr против & struct.ptr. Вы проверяли какой-либо один доступ к этому массиву, чтобы что-нибудь учитывало эти различия?

...