首先, 把你的代碼圖片換成代碼, 並且用本站自帶的編輯器/markdown語法格式化成代碼格式, 切記, 永遠不要貼代碼圖片. 至於你的代碼, 有兩個問題: scanf_s是msvc的私貨, 它要求你給出長度信息, 你沒有給. scanf_s/scanf接受的是const char *, 而在這裏你的name的類型是char [4], 即, 是一個字符數組, 切忌把字符數組和指針畫等號, 它們倆是兩個不同的類型(derived type). 但是, 數組有時候能隱式轉換成指針, 比如在scanf_s/scanf這裏, 要求的形參(parameter)是指針, 對吧, 但是你給的實參(argument)是數組, 在參數傳參時, 就會發生一個隱式轉換, 從數組磚到指針. 而如果你傳入的是&name, 那麼你需要明白的是name和&name的值雖然是相同的(都是二進制數, 可以理解爲地址), 但是它們倆的類型是不一樣的, name的類型窩上面說過了, 是char [4], which可以隱式轉換成指針, 然而&name的類型其實是char (*)[4], 他是一个指向數組(whose長度是4)的指針 是無法隱式轉換到const char *, which是scanf/scanf_s要求的類型. 所以引發了異常. 解決方案: scanf_s("%s", stu.name, sizeof(stu.name)); 簡體版本: 首先, 把你的代码图片换成代码, 并且用本站自带的编辑器/markdown语法格式化成代码格式, 切记, 永远不要贴代码图片. 至于你的代码, 有两个问题: scanf_s是msvc的私货, 它要求你给出长度信息, 你没有给. scanf_s/scanf接受的是const char *, 而在这里你的name的类型是char [4], 即, 是一个字符数组, 切忌把字符数组和指针画等号, 它们俩是两个不同的类型(derived type). 但是, 数组有时候能隐式转换成指针, 比如在scanf_s/scanf这里, 要求的形参(parameter)是指针, 对吧, 但是你给的实参(argument)是数组, 在参数传递时, 就会发生一个隐式转换, 从数组砖到指针. 而如果你传入的是&name, 那么你需要明白的是name和&name的值虽然是相同的(都是二进制数, 可以理解为地址), 但是它们俩的类型是不一样的, name的类型窝上面说过了, 是char [4], which可以隐式转换成指针, 然而&name的类型其实是char (*)[4], 它是一个指向数组(whose 長度是4)的指针, 是无法隐式转换到const char *, which是scanf/scanf_s要求的类型. 所以引发了异常. 解决方案: scanf_s("%s", stu.name, sizeof(stu.name));
首先, 把你的代碼圖片換成代碼, 並且用本站自帶的編輯器/markdown語法格式化成代碼格式, 切記, 永遠不要貼代碼圖片.
至於你的代碼, 有兩個問題:
scanf_s
是msvc
的私貨, 它要求你給出長度信息, 你沒有給.scanf_s/scanf
接受的是const char *
, 而在這裏你的name
的類型是char [4]
, 即, 是一個字符數組, 切忌把字符數組和指針畫等號, 它們倆是兩個不同的類型(derived type
). 但是, 數組有時候能隱式轉換成指針, 比如在scanf_s/scanf
這裏, 要求的形參(parameter)是指針, 對吧, 但是你給的實參(argument)是數組, 在參數傳參時, 就會發生一個隱式轉換, 從數組磚到指針. 而如果你傳入的是&name
, 那麼你需要明白的是name
和&name
的值雖然是相同的(都是二進制數, 可以理解爲地址), 但是它們倆的類型是不一樣的,name
的類型窩上面說過了, 是char [4]
, which可以隱式轉換成指針, 然而&name
的類型其實是char (*)[4]
, 他是一个指向數組(whose長度是4)的指針 是無法隱式轉換到const char *
, which是scanf/scanf_s
要求的類型. 所以引發了異常.解決方案:
簡體版本:
首先, 把你的代码图片换成代码, 并且用本站自带的编辑器/markdown语法格式化成代码格式, 切记, 永远不要贴代码图片.
至于你的代码, 有两个问题:
scanf_s
是msvc
的私货, 它要求你给出长度信息, 你没有给.scanf_s/scanf
接受的是const char *
, 而在这里你的name
的类型是char [4]
, 即, 是一个字符数组, 切忌把字符数组和指针画等号, 它们俩是两个不同的类型(derived type
). 但是, 数组有时候能隐式转换成指针, 比如在scanf_s/scanf
这里, 要求的形参(parameter)是指针, 对吧, 但是你给的实参(argument)是数组, 在参数传递时, 就会发生一个隐式转换, 从数组砖到指针. 而如果你传入的是&name
, 那么你需要明白的是name
和&name
的值虽然是相同的(都是二进制数, 可以理解为地址), 但是它们俩的类型是不一样的,name
的类型窝上面说过了, 是char [4]
, which可以隐式转换成指针, 然而&name
的类型其实是char (*)[4]
, 它是一个指向数组(whose 長度是4)的指针, 是无法隐式转换到const char *
, which是scanf/scanf_s
要求的类型. 所以引发了异常.解决方案: