int main()
{
struct Student_struct {
char name[40];
int age;
float grade;
};
struct Student_struct student;
printf("---------------------Student-----------------------\n\n\n");
student.name[] = "person"
student.age = 20;
student.grade = 7.5;
return 0;
}
我收到以下錯誤:']' 之前的預期運算式
我知道我可以使用 strcpy(student.name, "person") 或 student.name[6] = "person",但為什么不能將其編碼為 student.name[] = "person"?這背后的邏輯是什么?
uj5u.com熱心網友回復:
陣列大小已在結構宣告中定義。在宣告后使用方括號將訪問陣列中的元素,因此會出現錯誤。
uj5u.com熱心網友回復:
在 C 中,您不能在運行時分配整個陣列,它沒有合理的理由,語言就是這樣設計的。您只能在初始化期間設定陣列中的所有專案。同樣,您不能從函式回傳陣列。
在這種情況下,簡單的修復是 strcpy(student.name, "person");
但是,雖然您不能在運行時分配整個陣列,但您可以分配整個結構。這是一種可能的解決方法——通過創建一個臨時復合文字結構,我們可以這樣做:
student = (struct Student_struct){ .name = "person", .age=20, .grade=7.5 };
uj5u.com熱心網友回復:
我知道我可以使用 strcpy(student.name, "person") 或 student.name[6] = "person"
很好,但你知道后者不會做你所期望的嗎?
陣列不是 C 中的一等公民。句號。您不能僅僅因為 C 語言不允許將陣列作為賦值的左成員。
因此,當您使用時,student.name[6]這不是 6 個字符的陣列,而只是第 7個字符。語言允許這樣做,因為字符是數字型別,并且指標可以轉換為 int。
因此,student.name[6] = "person"首先獲取指向 litteral 字串的第一個元素的指標,將其"person"轉換 (*) 為整數值(如果指標大于整數,則可能已經定義了實作),然后嘗試將其存盤到呼叫未定義行為的單個 char 中ifchar不是無符號的。這真的是你所知道的嗎?
(*) 事實上,情況更糟,因為該語言需要顯式強制轉換才能將指標轉換為算術值,因此該代碼至少應該發出警告并且警告不會被忽略。因此,由于它違反了約束,因此代碼不是有效的 C。不過,如果被要求將此警告視為錯誤,我所知道的所有常見實作都將停止,否則將繼續我上面描述的方式。
uj5u.com熱心網友回復:
尺寸不足不是問題。指定大小無濟于事。
問題是您正在嘗試分配給陣列。這是不允許的。你需要使用strcpy或類似的。
strcpy(student.name, "person");
在這種特殊情況下,您可以初始化陣列而不是分配給它。
struct Student_struct student = {
.name = "person",
.age = 20,
.grade = 7.5
};
uj5u.com熱心網友回復:
它不起作用僅僅是因為它是無效的語法。如果要進行初始化,可以執行以下操作:
#include <stdio.h>
int
main(void)
{
struct student {
char name[40];
int age;
float grade;
};
struct student student = {
"person",
20,
7.5
};
struct student student2 = {
.name = "person",
.age = 20,
.grade = 7.5
};
printf("---------------------Student-----------------------\n\n\n");
printf("%s\n", student.name);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/417147.html
標籤:
上一篇:OpensslERR_error_string錯誤描述回傳null
下一篇:如何在C中正確讀/寫塊設備?
