奇怪的代码行为?

时间:2010-03-31 08:10:37

标签: c arrays data-structures pointers

我有一个C代码,其中我有一个结构声明,其中声明了一个int [576]数组。

由于某种原因,我不得不从结构中删除这个数组,所以我用指针替换这个数组为int * ptr;声明了一些相同类型的全局数组,代码中的其他地方,并通过将全局数组赋值给该指针来初始化该指针。所以我不必改变我从代码的其他部分访问这个数组的方式。

但是当我在结构中声明了数组时,它工作正常/给出了所需的输出,但是当我将它声明为结构中的指针并为此指针指定一个全局数组时它给出了垃圾输出,作为指针初始化。

所有这些代码都在MS-VC 6.0 / Windows setup / Intel-x86上运行。

我尝试了下面的事情:

  1. 怀疑结构填充/对齐但无法获得任何线索?如果在所有结构对齐可能是罪魁祸首,我怎样才能缩小范围并确认呢?

  2. 我确保在两种情况下都将数组初始化为某些默认值,比如在第一次使用之前说0,并且在初始化之前不使用它。

  3. 我尝试为这个新声明的数组使用全局数组和基于malloc的内存。同样的结果,垃圾输出。

  4. 我怎样才能解决这个问题呢?任何指针都会有所帮助。

3 个答案:

答案 0 :(得分:3)

尝试(清理并)重建您的项目,现有的目标文件仍然可以访问您的数组元素,就好像它没有在堆上分配而导致您的问题。

答案 1 :(得分:3)

您是否有可能在结构字段的任何位置使用 sizeof sizeof(int[576]) != sizeof(int*)

这应该是两者之间唯一可见的区别。

答案 2 :(得分:1)

您说您无需更改访问此阵列的方式。但是有些操作对于数组和指针有不同的结果。一个是已经提到的sizeof(struct.arr)与sizeof(struct.ptr),另一个是& struct.arr vs.& struct.ptr。您是否检查过对此阵列的任何单一访问,是否考虑到了这些差异?