我正在嘗試用 C 實作一個結構。我收到了這些錯誤。
請幫我解決這個錯誤,并向我解釋我做錯了什么。
main.c:7:12: error: variable ‘s1’ has initializer but incomplete type
7 | struct student s1 = {"Nick",16,50,72.5};
| ^~~~~~~
main.c:7:26: warning: excess elements in struct initializer
7 | struct student s1 = {"Nick",16,50,72.5};
| ^~~~~~
main.c:7:26: note: (near initialization for ‘s1’)
main.c:7:33: warning: excess elements in struct initializer
7 | struct student s1 = {"Nick",16,50,72.5};
| ^~
main.c:7:33: note: (near initialization for ‘s1’)
main.c:7:36: warning: excess elements in struct initializer
7 | struct student s1 = {"Nick",16,50,72.5};
| ^~
main.c:7:36: note: (near initialization for ‘s1’)
main.c:7:39: warning: excess elements in struct initializer
7 | struct student s1 = {"Nick",16,50,72.5};
| ^~~~
main.c:7:39: note: (near initialization for ‘s1’)
main.c:7:20: error: storage size of ‘s1’ isn’t known
7 | struct student s1 = {"Nick",16,50,72.5};
我的代碼
#include<stdio.h>
#include<stdlib.h>
int main()
{
struct student s1 = {"Nick",16,50,72.5};
printf("%s",s1.name);
// return 0;
}
struct student{
char name[4];
int age;
int roll_no;
float marks;
}s1;
uj5u.com熱心網友回復:
在本宣告中
struct student s1 = {"Nick",16,50,72.5};
編譯器不知道結構是如何定義的以及它有哪些資料成員。所以它發出訊息。
您需要在宣告結構型別的物件之前放置結構定義。例如
struct student{
char name[4];
int age;
int roll_no;
float marks;
};
int main( void )
{
struct student s1 = {"Nick",16,50,72.5};
//...
請注意,您正在嘗試使用結構型別的名稱 s1 宣告兩個物件。
第一個在 main 中宣告
struct student s1 = {"Nick",16,50,72.5};
和 main 之后檔案范圍中的第二個
struct student{
char name[4];
int age;
int roll_no;
float marks;
}s1;
在檔案范圍中洗掉此宣告,并將結構定義放在 main 之前,如上所示。
uj5u.com熱心網友回復:
AC 編譯器自上而下讀取每個源檔案。因此,當您嘗試創建型別為 的變數時struct student,該型別尚未定義。
在使用之前將結構定義移動到檔案的頂部。
uj5u.com熱心網友回復:
正如評論中發布的那樣,您的代碼存在一些問題:
- 當您嘗試使用
student該struct編譯器目前還不知道 char[4]太短而無法容納“尼克”,因為NULL每個字串中都有一個終止符,并且為了在 a 中使用name,您需要這個終止符。%sprintf()0
我將向您展示一個示例,其中包含一些宣告和使用它的常用方法
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char name[15];
int age;
int roll_no;
float marks;
} Student;
int main()
{
Student one;
Student other = {"Nick", 16, 50, 72.5};
Student modern_way =
{
.age = 12,
.name = "James Bond 007"
};
one = other; // one had no value yet
Student a_group[3] =
{
[1] = one,
[0] = other,
[2] = modern_way
};
printf("%s, %d\n%s, %d\n",
one.name, one.age,
other.name, other.age
);
printf("%s, %d\n", modern_way.name, modern_way.age);
// now a loop to list the ones in the array
for (int i = 0; i < 3; i = 1)
printf("-: %s, %d\n",
i,
a_group[i].name,
a_group[i].age);
return 0;
}
輸出
Nick, 16
Nick, 16
James Bond 007, 12
0: Nick, 16
1: Nick, 16
2: James Bond 007, 12
在代碼中,您會看到創建 a 更方便,typedef Student因此您可以使用它而無需記住并重新鍵入struct所有代碼。
使用大寫首字母表示命名事物的約定也很有用。
one 已宣告但未初始化,但在代碼后面分配了一個值
modern_way 以不太新的 90 年代方式初始化,您可以在其中命名欄位并僅初始化您需要的欄位,并以任何順序進行初始化。
a_group 向您展示如何處理初始化陣列,并展示您甚至可以在代碼中使用其他已知值。
一個for回圈顯示了如何將它們全部列出。
uj5u.com熱心網友回復:
這樣說
#include<stdio.h>
#include<stdlib.h>
struct student{
char name[4];
int age;
int roll_no;
float marks;
}s1;
int main()
{
struct student s1 = {"Nick",16,50,6};
printf("%s",s1.name);
// return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/367259.html
上一篇:為什么從呼叫<limits.h>定義的形式回傳這個奇怪的值?
下一篇:如何在c編程中忽略空格?
