C语言char*用scanf读入的问题

昨晚主席问了我一个问题,让我注意到了C语言的一个细节,原题如下。

首先A的语法不对,B的''问题不必多说,D是一定对的,问题在C上。

乍一看感觉C和D好像没什么区别,就在本地clion中试了一下,发现也没有问题。

但是在服务器环境下试了一下,报错段错误。

百度题库给的解释是:指针s未赋初值,所以指向一个不确定的地址,因而不能用scanf输入数据到这一指针所指向的地址。

这里有一个解决办法,就是先用malloc分配内存,之后用free释放掉,具体如下。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc,char** argv){
    char* s;
    s=(char*)malloc(sizeof(char));
    scanf("%s",s);
    puts(s);
    free(s);
    return 0;
}

至于为什么在clion中就可行呢?我个人推测(不一定对)是因为gcc版本问题,linux发行版自带gcc普遍版本较低,用gcc -v查看发现是4.x版本,而本地windows端是8.x版本。高版本gcc可能做了优化,屏蔽掉了这个问题。

另外如果想要升级gcc,可参考如下教程。感觉挺繁琐的,而且很多地方都要设置镜像以提高下载速度,所以我暂时就没有理会了。

https://itbilu.com/linux/management/V1vdnt9ll.html

原文地址:https://www.cnblogs.com/wzgg/p/14187497.html