1. 程式人生 > >在結構中使用字元陣列還是字元指標

在結構中使用字元陣列還是字元指標

宣告一個數組有三種方法:

  • 宣告一個數組,宣告時用常量表達式指定陣列維數
  • 宣告一個變長陣列,宣告時用變量表達式指定陣列位數(C99以後)
  • 宣告一個指標,呼叫malloc()分配合適的記憶體

使用第二種和第三中方法可以建立一個動態陣列,即一個程式在執行時才分配記憶體並可選擇陣列的大小。

在結構中使用字元陣列和字元指標儲存字串都是可行的,如下面的宣告:

#define LEN 20
struct stu
{
    char name[LEN];
    char num[LEN];
}
struct teac
{
    char * name;
    char * num;
}

但是在宣告結構變數和結構初始化時,可能會出現一些問題

sruct stu dent = {"taide", "S20160720"};

struct teac her = {"zhou", "T113469"};

這段程式碼可以正常執行,但是我們卻不知道字串儲存在哪。對於struct stu 變數 dent 來說,字串儲存在結構內部,這個結構總共分配了 40 個位元組來存放兩個字串。然而對於struct teac 變數 her來說,字串儲存在編譯器儲存字串常量的任何地方。這個結構中存放的只是兩個地址而已,它不字串分配任何儲存空間,它只適用於管理那些已經建立的而且在程式中已經分配過空間的字串。

struct stu dent; 
struct teac her;
gets(dent.name);
gets(her.name);

對於dent ,名字 name有一個用來存放字串的陣列;對於teac ,gets( )把字串放到由 her.name 給出的地址中。但是這是一個未初始化的變數,該地址可能是任何值,程式就可以把名字放到任何地方。因此,如果需要一個結構來儲存字串,請儘量使用字元陣列在結構中使用指標處理字串的一個用意義的方法是使用 malloc ()分配記憶體,並用指標來存放地址。這個方法的優點是可以申請合適的空間,不至於浪費記憶體空間。

char temp[20];
struct teac * her;
puts("input name of teacher:");
gets(temp);
her->name = (char *)malloc(strlen(temp) + 1);//分配儲存name的記憶體
strcpy(her->name, temp);//把name複製到分配的記憶體中
free(her->name);//釋放記憶體