昨晚主席問了我一個問題,讓我注意到了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