【发布时间】:2013-08-16 12:15:54
【问题描述】:
我有一个 C 代码,它在 Solaris 机器上运行良好,但相同的代码有时会出现分段错误,有时会产生不同的输出。
以下是我在两台机器上有所不同的部分:
FILE *inf;
unsigned char *ptr;
unsigned short *ds;
int n, s;
char work[100];
inf = (FILE *) fopen("Filename", "r");
s = fseek(inf, 0, SEEK_SET);
n = fread(work, 1, sizeof(work), inf);
ptr = (unsigned char *)work;
ptr += 8;
count = 0;
ds = (unsigned short *) ptr;
count = *ds;
当我打印计数值时,15 in Solaris Machine 和 768 in Linux machine。
请建议我在 Linux 机器上对代码进行的更改。
【问题讨论】:
-
Solaris 机器的字节序是什么?
-
fopen()的返回值不用强制转换,不要那样做。此外,您当然应该在依赖结果之前检查所有 I/O 调用是否成功。 -
打开读取的文件位于文件的开头。
fseek()是多余的 - 但它是如此多余,以至于它不是您问题的一个因素。我假设尽管没有错误检查,fopen()(特别是)失败没有问题。 -
您是否对每台机器上读入
work的值进行了逐字节转储?每台机器都一样吗?你检查n的值了吗?您的代码要求读取最多 100 个大小为 1 的单位,因此您可以获得短读取 (n < 100)。写入文件的数据结构是什么?它是如何写在 SPARC (Solaris) 机器上的?您使用 8 的偏移量;你确定这是正确的吗?文件是在 Solaris 上写入并在 Linux 上读取,还是在 Solaris 上写入和读取正常,但在 Linux 上写入然后读取时失败? -
无论问题的细节如何,您都应该致力于提供与平台无关的代码——因此相同的源代码可以在 Linux(Intel,little-endian)和 Solaris(SPARC,big-endian)上运行.这是完全可行的;它只需要一些照顾。因此,您的“Linux 上代码更改”评论让我担心;您应该寻求“更改代码以使其在 Linux 和 Solaris 上都可以工作”。