1. 程式人生 > >C語言,結構體中字串的宣告(採用字元指標還是字元陣列)

C語言,結構體中字串的宣告(採用字元指標還是字元陣列)

      結構體中,字串選項是用字元陣列表示好,還是用字元指標表示好?

typedef struct person{
	char *name;
	int age;
	char sex[6];
}

      該結構體中name用的是指標而不是陣列,所以需要給字串在堆上申請記憶體然後再賦值;sex字串用的是字元陣列,因此可以給其賦值;

      用字元指標的優勢是:字元指標不會限制字串的大小。如果用字元陣列,需要提前決定字串的長度。

      上面的結構體中,name的值可以設無限長(前提時,要在堆上申請記憶體),而sex的字串長度不能超過6。

下面是結構體物件建立的過程:

man creat(char *name, int age, char *sex)
{
	man *i = malloc(sizeof(man));
	i->name = strdup(name);
	i->age = age;
	i->sex = sex;
	
	return i;
}
strdup()函式會計算出字串的長度,然後呼叫malloc函式在堆上申請相應的空間,最後把字串的所有字元複製到堆上。

我們也可以在strdup()函式的基礎上,實現一個有錯誤提示的strdup()函式

char * safe_strdup(const char *s) 
{
    char * retval = NULL;
    if (!s) 
    {
        debug(LOG_CRIT, "safe_strdup called with NULL which would have crashed strdup. Bailing out");
        exit(1);
    }
    retval = strdup(s);
    if (!retval) 
    {
        debug(LOG_CRIT, "Failed to duplicate a string: %s.  Bailing out", strerror(errno));
        exit(1);
    }
    return (retval);
}

物件建立的函式也可以隨之做些更改:

man creat(char *name, int age, char *sex)
{
	man *i = malloc(sizeof(man));
	i->name = safe_strdup(name);
	i->age = age;
	i->sex = sex;
	
	return i;
}




相關推薦

C語言結構字串宣告採用字元指標還是字元陣列

      結構體中,字串選項是用字元陣列表示好,還是用字元指標表示好? typedef struct person{ char *name; int age; char sex[6]; }       該結構體中name用的是指標而不是陣列,所以需要給字串在堆上申

C語言結構一級指標和二級指標的建立與釋放示例

這幾天把C語言鞏固了一下,作為一門最基本的程式語言,C語言還是相當基礎和非常重要的,個人認為C語言還是很有必要學好吃透的。 今天寫的話題是結構體結構體中一級指標和二級指標的建立與釋放,以一個例子來說明,筆者這裡自己敲得程式碼,雖然用C語言幾年了,但是有的東西還是會遺忘。筆者

C語言 struct結構的變數宣告加冒號

有些資訊在儲存時,並不需要佔用一個完整的位元組,而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有0和1兩種狀態,用一位二進位即可。 為了節省儲存空間,並使處理簡便,C語言又提供了一種資料結

C語言結構.->的區別

一直以為這兩個是沒有什麼區別的,可以相互替換,今天又翻了一下《C語言核心技術》,明白了其中的奧妙。相同點:兩個都是二元操作符,其右操作符是成員的名稱。不同點:點操作符左邊的運算元是一個“結果為結構”的表示式;                箭頭操作符左邊的運算元是一個指向

C語言 Struct 結構在 Java 的體現

修飾符 無法 輸入 更多 好用 ++ [] 的區別 import   大一整個學期完成了 C 語言的學習,大二就進入了Java 的學習。   和C語言一樣,我們都會嘗試寫一個小小的學生管理系統什麽的,學習過 C 語言同學知道,在管理系統中 Struct 結構體是個很好用的東

C語言結構詳解轉載只是為了查閱方便若有侵權立刪

C語言的結構體詳解 結構體(struct) 1、定義   一般格式為:          struct 結構名          {    

C++:對結構字元陣列賦值時出現表示式必須是可修改的左值的問題

問題描述:         在C++中為結構體中的字元陣列賦值時,出現”表示式必須是可修改的左值“的錯誤提醒,編譯報錯“不可指定資料型別”。           &n

[流暢的 C]C語言結構轉化為字串

[流暢的 C] C語言將結構體轉化為字串 Overview 思路 直接使用 memcpy 之類的是不可以的。所以最好的做法就是定義結構體的時候就實現對字串的轉換。 就像 Python 的 __str__ 一樣。 (不好意思,博主雷打不動轉python!信仰

C語言結構、聯合記憶體對齊規則總結

一、結構體 1.1什麼是結構體       在C語言中,結構體是一種資料結構,是C提供的聚合型別(C提供了兩種聚合型別:陣列和結構)的一種。結構體與陣列的區別是:陣列是相同型別的集合,而結構體可能具有不同的型別。 結構體也可以被宣告為變數,陣列或者指標等,用以實現較複雜的

C語言結構列舉聯合

一.結構體型別建立 結構體是一些值的集合,這些值稱為成員變數。結構體的每一個成員可以是不同型別的變數。 1.結構體的宣告 struct tag {   member-list; }variable-list; 舉例: 描述一個學生 struct Stu { &

C語言根據結構成員變數的地址得到結構的地址

/** * container_of - cast a member of a structure out to the containing structure * * @ptr: the pointer to the member. * @type: the type of the container s

C語言_結構巢狀和字串陣列的表示_plusC14.3

#include<stdio.h> #define LEN 20 const char *mgs[5]= {"qqqq","wwww","EEEEEEE","RRRR","TTTTT" }; struct apple {char smell[LEN];char

C 語言結構

ons nbsp span clas %d str style ret [] 1 #include <stdio.h> 2 3 #include <struct.h> 4 5 #include <string.h>

11、C語言結構和共用

結構體數組 結構體 float add font sco 規則 student mon 一、結構體   結構體:是一種自定義的構造數據類型   用途:把不同類型的數據組合成一個整體。     結構體類型定義:     struct [結構體名]    {       類型識

C語言小結--結構

1 什麼是結構體 結構體是一種聚合資料型別,它是一種資料元素的聚合。比如我們描述一個學生時,要求有他的姓名、學校、分數等等資訊,在之前的處理中,我們通常會使用單獨的資料型別來描述。比如,定義一個字串陣列來描述姓名char name[20] = "xiaoming",定義一個浮點數來描

C語言結構 共用 列舉 typedef

結構體型別和結構體變數, struct 定義結構體型別時 不佔記憶體 匿名結構體,無法建立變數訪問,有限的結構體型別變數 結構體變數不能整體引用,只能引用變數成員 結構體變數用大括號賦值,只有在建立並初始化的時候才可以 #define _CRT_SECURE_NO_WARN

C語言結構

1.結構體 a.概念:結構是一些值得集合,這些值成為成員變數。結構的每個成員可以是不同型別的變數。 b.宣告: eg宣告一個學生資訊的結構體。 struct Stu { char name[20]; short int age;

C語言結構給另一個同類型結構賦值: 用等號即可

看到很多C程式碼的結構體賦值都是用memcpy函式來拷貝,其實根本不需要,用等號直接賦值即可。結構體描述的是的一塊連續記憶體的記憶體佈局,同類型的一個結構體變數給另一個結構體變數賦值,使用等號編譯不會有任何問題,其效果顯然也和人直覺認為的一樣,拷貝對應記憶體。

C語言入門-結構

 查詢學生成績: #include <stdio.h> #include <string.h>//用字串中的strlen,strcmp,strcpy等需要標頭檔案 #define N 2 void input(char no[ ][11],ch

1-C語言結構、共用、列舉

一、關鍵字說明         C語言有32個關鍵字,C語言通過關鍵字的使用使編譯器進行相關的操作          結構體對應關鍵字struct          共用體(聯合體)對應的關鍵字是union          列舉型別對應的關鍵字是enum 二、結構