關於結構體初始化的乙個問題

2021-10-06 09:44:36 字數 3454 閱讀 3062

開始自學程式設計,但是程式設計之路困難重重,於是我打算將學習之中遇到的問題以及解決方案貼在這裡,方便以後複習。

那我今天總結了一下結構體初始化的幾種方法.如下:

#include

#include

typedef

struct student

stu;

intmain()

;//定義的同時初始化

stu s2;

s2 =

(stu)

;//先定義再初始化

stu s3;

strcpy

(s3.name,

"小李");

// s3.age =

19;

stu s4 =

;//指定資料進行賦值(1)

stu s5 =

;//指定資料進行賦值(2)

printf

("%s %d\n"

,s1.name,s1.age)

;printf

("%s %d\n"

,s2.name,s2.age)

;printf

("%s %d\n"

,s3.name,s3.age)

;printf

("%s %d\n"

,s4.name,s4.age)

;printf

("%s %d\n"

,s5.name,s5.age)

;}

我們執行上面的**就會出現下面的列印結果。

小明 18

小紅 17

小李 19

大白 20

小黑 19

注意:

*(1)在初始化s2時,前面一定要加上結構體型別,否則會報錯:[error] expected expression before 『」標記之前需要表示式。還有陣列必須定義的時候初始化,而結構體卻可以先定義再初始化。

(2)再初始化s3時,字串賦值是要用到strcpy,而不可以直接 「=」 進行賦值,否則會出現[error] assignment to expression with array type,意思是賦值給陣列型別的表示式。

(3)再初始化s4時,一定要記得加上『 . 』*

但是呢?昨天一位群友卻問了這樣乙個問題,可讓我想了好一會。如下:

#include

#include

typedef

struct student

stu;

intmain()

;printf

("output:");

puts

(s1.name)

;printf

("%d"

,s1.age)

;}

大概看一下,他的意思很明確,就是想在初始化s1時,賦值乙個變數,而這些變數是未知的是等待使用者輸入的,而這就讓我不太明白了,一般情況下,我都會選擇直接接收鍵盤輸入進行賦值,就像這樣

stu s1;

gets

(s1.name)

;scanf

("%d"

,&s1.age)

;

當我用這個替換上面打**時,就解決了問題,正常輸出了

input:小明

34output:小明

34

然後我又嘗試執行了他的**後,卻不能正常輸出了,如下:

input:小明

34output:?

0

於是我便想為什麼會出現這樣的錯誤呢?

為了便於檢視,我便將問題進行了簡化。

#include

#include

intmain()

很顯然這樣是會出現錯誤的,錯誤為:[error] assignment to expression with array type,意思是賦值給陣列型別的表示式,一想便會明白,b便是這個陣列的首位址了,而位址當然是不能隨便更改的啦,然後我便想到了指標,於是:

#include

#include

intmain()

結果便正常了。

於是根據這個道理,我便嘗試,修改結構體的那個陣列為指標,如下:

#include

#include

typedef

struct student

stu;

intmain()

;printf

("output:");

puts

(s1.name)

;printf

("%d"

,s1.age)

;}

結果呢?便可以正常了!

input:小明

34output:小明

34

但是如果用陣列該怎麼解決呢?

借用strcpy試試

#include

#include

typedef

struct student

stu;

intmain()

結果呢?也是可以的!

input:小明

34output:小明

34

我們剛才用的是第三種初始化的方法:先定義,再逐個初始化,那麼我們如何定義的同時初始化呢?

於是我檢視了strcpy的函式原型:

char

*my_strcpy

(char

*dest,

const

char

*src)

我們發現strcpy是有返回值型別的,那我們借用第四種初始化的方法試一試呢?

#include

#include

typedef

struct student

stu;

intmain()

;printf

("output:");

puts

(s1.name)

;printf

("%d"

,s1.age)

;}

結果呢?卻出現了不明字元。於是我便嘗試了多次,結果每次輸入時第乙個字元總是不正確。

input:小明

23output:悺明

23

關於陣列初始化的乙個問題

指定陣列長度之後,如果採用int arr 10 這種方式來初始化,陣列有10個元素,把第乙個元素初始化為0,其餘元素預設初始化為0 不指定陣列長度,採用int arr1 這種方式來初始化,這種建立陣列的方式,不直接指定陣列的元素個數,次數陣列根據初始化的內容,來指定元素個數。因為裡面只有乙個0,所以...

結構體初始化 指定初始化

參考 c99支援結構的指定初始化專案,其語法與陣列的指定初始化專案近似。只是,結構的指定初始化專案使用點運算子和成員名 而不是方括號和索引值 來標識具體的元素。例如,只初始化book結構的成員value,可以這樣做 struct book surprise 可以按照任意的順序使用指定初始化專案 st...

結構體初始化

結構體變數初始化 tag 結構體,結構體變數,結構體變數宣告,結構體變數初始化,結構體變數引用,結構體成員變數引用 text c語言中引用變數的基本原則是在使用變數前,需要對變數進行定義並初始化。其方法是在定義變數的同時給其一初始值。結構體變數的初始化,遵循相同的規律。簡單變數的初始化形式如下 資料...