#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;
}
我真正需要知道的是为什么这段代码在旧服务器上可以正常运行,而我却忽略了什么?我可以更改代码以使用普通数组来使其在新服务器上运行,但是可能导致什么问题呢?
我正在使用一些在Solaris 10上运行的古老遗留代码。在旧服务器上,该代码已编译并且可以正常运行。然后将代码迁移到Solaris 11服务器上,在其中...
-fwritable-strings
所做的操作,该标志在最早的版本中默认情况下处于启用状态,然后在以下情况下默认情况下处于关闭状态在成为removed in gcc 4.0之前的几个发行版中,始终使常量字符串在只读内存中。较早的Sparc机器将所有内存视为一大堆寄存器,可以在其中读写任何寄存器
最有可能的问题不是操作系统版本,而是构建代码所使用的编译器。这段代码有很多问题,很容易看出它在一个编译器上如何工作而在另一个编译器上如何工作。鉴于我们不知道您使用的是什么编译器,因此我不作推测。