【问题标题】:Strange code behaviour?奇怪的代码行为?
【发布时间】:2010-03-31 08:10:36
【问题描述】:

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

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

但是当我在结构中声明数组时它可以正常工作/提供所需的输出,但是当我将它声明为结构中的指针并将全局数组分配给该指针时,它会提供垃圾输出,作为指针初始化。

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

我尝试了以下方法:

  1. 怀疑结构填充/对齐但无法获得任何线索?如果结构对齐可能是罪魁祸首,我该如何继续缩小范围并确认?

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

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

如何解决问题?任何指针都会有所帮助。

【问题讨论】:

  • 根据您对该数组的操作以及您对它的期望,新代码的功能可能与旧代码几乎相同,或者可能完全不同。如果没有真正看到您正在尝试做什么,就无法说出发生了什么。
  • 那是什么垃圾输出?您是否尝试将数组初始化为相同的保护值(不同于零?)

标签: c arrays data-structures pointers


【解决方案1】:

你有可能在结构字段的任何地方使用 sizeof 吗? sizeof(int[576]) != sizeof(int*).

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

【讨论】:

  • 虽然我使用 sizeof(structure) 为该结构分配内存,但出于调试目的,我还尝试将数组保持在结构中,然后在该结构中声明另一个指针,然后制作该指针指向该数组。所以基本上试图确保 sizeof 没有出错。结果还是一样,输出不好。
  • @EFraim:谢谢。在我的代码中的某些 mecpy 中有一些大小出错。
【解决方案2】:

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

【讨论】:

  • 尝试创建一个演示问题的最小示例。当你拥有它时,你可能会知道你做错了什么。如果不只是将其添加到问题中。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多