可在一个服务器上运行的C代码,但不能在另一台服务器上使用

问题描述 投票:0回答:3

我正在使用一些在Solaris 10上运行的古老遗留代码。在旧服务器上,该代码已编译并且可以正常运行。

然后将代码迁移到Solaris 11服务器,该代码仍在其中编译,但是在运行时会创建seg Fault Core Dump。

在两种情况下,使用的编译器都是/ opt / SUNWspro / bin / cc。

这是代码段:

#include <stdio.h>

char   *blank = "                                   ";

main(argc,argv)
int argc;
char **argv;
{

blank[35] = '\0';
printf("Success.\n");

}

这在Solaris 10上有效,但在Solaris 11上引起了Segmenation错误(核心转储)。通常,我会说,segfault是由于在blank []数组仅上升为blank [34](它初始化为35个空格字符)时尝试写入blank [35]引起的,但此代码在Solaris上有效10。

此外,当我将行更改为'blank [34] ='\ 0';'在新服务器上,我仍然得到了segfault核心转储。

当我将空白更改为普通数组(同时对main进行现代化处理时,一切正常,正如我期望的那样:

#include <stdio.h>

char blank[35];

int main(int argc,char **argv)
{

  int i;

  for (i=0; i<34; i++)
  {
   blank[i] = ' ';
  }

  blank[34] = '\0';
  printf("Success.\n");
  return 0;
}

我真正需要知道的是为什么这段代码在旧服务器上可以正常运行,而我却忽略了什么?我可以更改代码以使用普通数组来使其在新服务器上运行,但是可能导致什么问题呢?

c solaris
3个回答
3
投票

请注意,您没有char blank[],而是char *blank,它指向字符串文字。字符串文字是不可变的。该代码试图修改由blank指向的文字的字符之一。另外,字符串文字已经隐式地以NULL终止,因此无论如何都不需要在末尾显式添加NULL。


0
投票

较早的Sparc机器将所有内存视为一大堆寄存器,可以在其中读写任何寄存器

后来的Sparc机器采用了newman架构,包括内存页面的概念,并具有只读,可执行文件等属性


0
投票

最有可能的问题不是操作系统版本,而是构建代码所使用的编译器。这段代码有很多问题,很容易看出它在一个编译器上如何工作而在另一个编译器上如何工作。鉴于我们不知道您使用的是什么编译器,因此我不作推测。

但是我敢打赌,如果机器具有相同的硬件体系结构(例如,两个都为ultrasparc),而如果您在Solaris 10上编译二进制文件,那么它将在Solaris 11上正常运行。

© www.soinside.com 2019 - 2024. All rights reserved.