gets_s()函式的引數太少,strcpy_s():形參和實參 2 的型別不同,等c函式在Visual Studio上出現的問題, get()函式和scanf()讀取字串的區別,棧的隨機性...
阿新 • • 發佈:2021-02-09
首先,這些C函式,在VS上要加_s字尾的原因是,這些函式存在字串越界等問題,可以參考這篇文章,https://blog.csdn.net/silleyj/article/details/8545408
個人猜測:由於這些C函式存在這些問題,所以VS編譯器直接遮蔽了這些函式,然後用了一套加上字尾_s的函式來實現相同的功能,為了解決之前函式的越界的問題,_s系列的函式又分別增加了一些形參,比如長度等,所以,即使我們在C語言函式的基礎上加上_s,還是會出現引數太少或形參型別和實參型別不匹配的問題。檢視_s函式的形參列表的方式是:將游標移到你要查詢的函式名裡,然後單擊右鍵,選擇檢視定義(或者使用快捷鍵 Alt + F12),然後就可以看到新版本的安全的C函式的形參列表了,根據這個形參列表設定實參就可以了
比如:
gets_s()函式的查詢結果:
,可以看出,這個函式需要兩個引數,一個是字串的首地址,另一個是字串的最大長度strcpy_s()函式的查詢結果:
,可以看出,這個函式需要傳遞三個引數,分別是目的字串首地址, 目的地址的大小, 原字串的首地址scanf_s的查詢結果是:這個查詢不出來,可以參考這篇文章:https://blog.csdn.net/silleyj/article/details/8545408, 輸入字串還要傳遞一個大小,如:scanf_s("%s", s, 20);
gets(s)函式可以讀取輸入的字元序列裡的空格,作用相當於getline(cin, s);
scanf("%s", s),只能空格前面的字串,即認為遇到空格則停止讀取,作用相當於cin >> s;
棧的隨機性:
1 //#include "SeqList.h" 2 #include <stdio.h> 3 #include <string.h> 4 5 static int c = 2; 6 int b = 0; 7 int main() 8 { 9 10 int a = 1; 11 const int d = 0; 12 printf("%p\n", &a); //棧的隨機性,使得a所在的棧段的位置在不斷變化,所以a的地址每次執行這個檔案a的地址都會變化 13 printf("%p\n", &c); 14 printf("%p\n", &b); 15 printf("%p\n", &d); 16 return 0; 17 }
有關記憶體分割槽可以參考這篇文章:https://www.cnblogs.com/bakari/archive/2012/08/05/2623637.html