C语言char*用scanf读入的问题
昨晚主席问了我一个问题,让我注意到了C语言的一个细节,原题如下。
首先A的语法不对,B的'\0'问题不必多说,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