2012-12-02 126 views
1

我對結構的一些問題和指針結構體和指針

對於這個結構:

typedef struct tNode_t { 
    char *w; 
} tNode; 

怎麼來的,如果我想改變/知道* w的值我需要使用t.w = "asdfsd"代替 的t->w = "asdfasd"

而我編譯這個成功沒有t.w = (char *) malloc(28*sizeof(char)); 在我的測試代碼,是否有一個原因,爲什麼tt不需要?

樣品主:

int main() 
{ 
    tNode t; 
    char w[] = "abcd"; 
    //t.word = (char *) malloc(28*sizeof(char)); 
    t.word = w; 
    printf("%s", t.word); 
} 

感謝。

+2

它會編譯,因爲您已經定義了本地副本,不需要再次動態創建它。 – enjoylife

回答

2

t->w(*t).w的簡寫,即只有在t是指向結構的指針時才使用箭頭纔有意義。

另外,由於您分配的字符串是硬編碼的(因此在編譯時確定),因此不需要在運行時動態分配其內存。

0

看看這個教程:http://pw1.netcom.com/~tjensen/ptr/ch5x.htm

struct tag { 
char lname[20];  /* last name */ 
char fname[20];  /* first name */ 
int age;    /* age */ 
float rate;   /* e.g. 12.75 per hour */ 
}; 

琦,所以我們知道我們的指針會指向一個結構中使用結構標記聲明。我們宣佈與聲明這樣的指針:

struct tag *st_ptr; 

,我們把它指向我們的例子結構:

st_ptr = &my_struct; 

現在,我們可以通過取消引用指針訪問給定的成員。但是,我們如何去引用指向結構的指針呢?那麼,考慮一下這樣的事實,我們可能想使用指針來設置員工的年齡。我們會寫:

(*st_ptr).age = 63; 

仔細看看這個。它說,用圓括號替換st_ptr指向的內容,即my_struct結構。因此,這分解成與my_struct.age相同。

然而,這是一個相當經常使用的表達和C的設計師們創造具有相同的含義,是一個替代語法:

st_ptr->age = 63; 
0

怎麼來的,如果我想更改/知道值* w我需要使用tw = 「asdfsd」而不是t-> w =「asdfasd」?

如果您的t是指針,則需要使用t->w。否則你應該使用t.w

在我的測試代碼中,是否有一個原因,爲什麼tt不需要?

在您的代碼中,您已將t.word設置爲指向存儲char w[] = "abcd";的區域。所以你不需要malloc一些內存爲你的t.word

在需要malloc另一個例子是:

tNode t; 
t.word = (char *) malloc(28*sizeof(char)); 
strcpy(t.word, "Hello World"); 
printf("%s", t.word); 
0

怎麼來的,如果我想改變/知道* w的值,我需要使用TW = 「asdfsd」,而不是T-> w =「asdfasd」?

ttNode,而不是一個指針tNode,所以.是適當的存取器。

我編譯成功,沒有t.w =(char *) malloc(28 * sizeof(char));在我的測試代碼中,有沒有一個原因爲什麼 tt不需要?

這是不需要的,因爲"abcd"仍在範圍內,所以w可以指向它。如果你想w指向持久化的內存管理內容,它將不得不像這一行那樣分配它自己的內存。