2014-07-13 32 views
1

下面是我寫使用指針打印出從結構的串碼:指針結構沒有返回一個字符串

#include <stdio.h> 
#include <stdlib.h> 
struct xenon 
{ 
    int size1; 
    int marks[10]; 
    char *w; 
    struct xenon *p; 
} x1,x2; 

main() 
{ 
    x1.size1=10; 
    x2.size1=6; 
    printf("%d\n",x1.size1); 
    printf("%d\n",x2.size1); 
    (*p).w="my word"; 

    printf("%s\n",(*p).w); 
    printf("%s\n",x1.w); 
} 

現在我得到一個錯誤說我還沒有宣佈函數變量p主要。但是,這也應該是這樣,當我宣佈

x1.w="my word"; 
printf("%s",x1.w); 

我也試過聲明指針變量只是結構之外,它仍然不會編譯。 我如何聲明一個指向結構的指針是錯誤的?還是完全是另一回事?

+0

那麼,你已經定義了x1和x2。所以你有x1.p和x2.p,但是它們沒有在你的代碼中初始化。你可以設置,例如,x1.p = &x2; – Steger

+0

'x1'和'x2'是全局變量,所以它們存在。 – AntonH

回答

3

發生編譯時錯誤是因爲p是結構的成員,而不是範圍內的變量。所以請參考它,就像你提到它的兄弟姐妹一樣。

(*x1.p).w="my word"; 

printf("%s\n",(*x1.p).w); 

解決該問題後,您會遇到Steger在上述評論中提到的運行時錯誤。您可以將x1.p分配給& x2。但是如果你想創建一個鏈表,你會想要將x1.p分配給一個動態分配的結構。

+0

您需要在解除引用前將'x1.p'指向有效內存 –

+0

是的,並且在上面的第二段中提到。 –

+0

非常感謝解釋:) –

0
(*p).w="my word"; 

p是該結構的成員。您尚未向該結構聲明任何指針變量。您需要像下面那樣聲明結構變量。

struct xenon 
{ 
    int size1; 
    int marks[10]; 
    char *w; 
} x1,x2 *p; 

這裏內存x1x2已經被分配了,這樣你就可以直接使用它。但在使用p之前,您需要分配內存或者需要分配另一個結構變量的地址。

p = malloc(sizeof(struct xenon); 

p = &x1; 

您可以直接通過p->w="my word"指定字符串文字,否則你可以爲分配內存和複製字符串像下面。

p->w = malloc(strlen("my word") + 1); 
strcpy(p->w, "my word") 
+0

我明白你的觀點,但是你怎樣將字符串賦值給char * w?......如你能給出具體的代碼嗎? –

+0

更新了我的答案。請檢查。 –