【问题标题】:C on Windows vs Linux - differencesWindows 与 Linux 上的 C - 差异
【发布时间】:2014-04-14 09:22:25
【问题描述】:

此代码适用于 Windows (Visual Studio),但在 Linux GCC 上,它会产生不正确的结果。有人可以发现问题吗?在 linux 和 windows 上有何不同?

有没有办法在 Linux 上编译它?我宁愿让它与 GCC 一起工作,所以如果你能帮助我发现代码中在 Linux 上表现不同的问题,那就太好了。谢谢 -

像这样返回: 字符输出[8]; 字符 *x = 输出; 返回 x;

【问题讨论】:

  • 你不能认真地期待对这么多代码的免费审查,对问题的“描述”如此模糊?!
  • 示例输入文件在哪里?什么是预期的输出?你到底得到了什么?
  • 谢谢李,输入是简单的汇编代码:移动 ax, bx 和输出应该是:89 d8(十六进制)或二进制,它应该是:10001001 11011000
  • 你试过调试吗?并且也尝试在 Windows 上使用 GCC 编译它...
  • 除了下面的答案,为什么要将操作码存储为字符串而不是整数?

标签: c linux gcc window


【解决方案1】:

首先,您有大量代码返回指向本地数组的指针,这是不允许的,并且在稍后取消引用这些指针时会导致未定义的行为。如果该代码在 Windows 中有效,那么您很幸运,因为该代码无效。

两种典型的解决方案是:

  1. 让调用者将一个指针(当然还有size_t 长度值以防止被覆盖!)传递到允许被调用函数工作的字符串空间。
  2. 为函数内部的字符串动态分配新内存并返回。当不再需要该内存时,调用者负责free()

【讨论】:

  • 感谢您的回复。我可以分配内存并返回它而不是指针吗?你有什么建议?
【解决方案2】:
        char output[8];
        char *x = output;
        return x;

这是您在程序的很多地方(此处为asciiToBin)所做的事情,并且会调用未定义的行为。您正在返回使用自动存储声明的数组的第一个元素的地址。当您从函数返回时,具有自动存储功能的对象将被销毁,并且访问它们会调用未定义的行为。

【讨论】:

  • 感谢您的回复。您有什么建议可以避免这个问题?
  • @user3530178 例如,您可以将输出数组(通过指针)传递给函数
  • 谢谢@ouah,我会努力做出改变。如果您发现其他任何内容,请发表评论。
猜你喜欢
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多