将系统从一台服务器迁移到另一台服务器后,我有一些 C 代码崩溃了。它在 gcc 4.2.1 下编译时有效,但在 4.8 下它崩溃了......这是代码:
void initcap(char *inbuf) {
/* freshen case in string, capitalize first letters */
char *ptr;
*ptr=toupper(*inbuf); /* first letter must be cap causing SEG fault */
for (ptr=inbuf+1; *ptr; ptr++) {
if ( (isspace(*(ptr-1))) || (ispunct(*(ptr-1))) || (isdigit(*(ptr-1))) )
*ptr=toupper(*ptr);
else
*ptr=tolower(*ptr);
}
}
导致段错误的行是:*ptr=toupper(*inbuf);
有人可以解释一下我的环境发生了什么变化,可能使它在一个系统上工作正常,而不是在更现代的服务器上工作吗?解决方法是什么?我是否应该在代码的其他区域搜索类似问题?
最佳答案
char *ptr;
*ptr=toupper(*inbuf); /* first letter must be cap causing SEG fault */
突击测试时间:ptr
指向什么?
如果您回答“nuthin”,您就赢了!它没有被初始化,所以它的初始内容是随机的垃圾。祝贺您在进程地址空间中加扰了一个随机指向的字节。你赢了一次完全随机的段错误和一次崩溃。
关于从 gcc 4.2 迁移到 4.8 时代码生成段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36877555/