2012-11-15 73 views
1

我已經宣佈在我的h文件的結構,因爲這樣的:分配值在結構來PTR(C)

struct node{ 
char* string; 
} 

我打算這已經創建了一個結構,例如,具有一個部件,字符指針名爲string。

現在,我計算出字符串的長度和malloc是一個合適大小的數組,並將其與輸入結合起來。

char* test; 
test = (char*) malloc(n * sizeof(char)); 

據我所知,這已經創造了字符指針的測試,並已分配它在我剛malloc分配數組的頭指向。然後,我繼續將每個數組槽分配給用戶輸入的字符,然後將其讀回 - 這一切都可以編譯並正常工作。我的問題是當我嘗試這個字符指針分配給傳入這個結構的結構節點的字符串指針,如:

int f1(struct node* new){ 

所以我儘量在結構指針分配給指針的值到數組中,就像這樣:

new->string = test; 

但我段錯誤。

對我來說,這似乎是我分配一個char *的東西,期望一個字符*所以這應該工作正常...我可能錯過了一些愚蠢的東西,但沒有人有一個方向指向我?非常感謝!

+3

'new'是否指向一個已分配(棧或動態,請選擇)'struct node'?即使'test'是一個假指針,除非'new'無效,那麼賦值語句不會導致seg-fault。 – WhozCraig

+0

脫離主題,但不要將變量命名爲'new',否則會混淆C++程序員。 – JohnnyHK

+0

如果您想要移植到C++,那麼使用「new」作爲標識符並不是一個好主意。 – Sebastian

回答

3

檢查您的呼叫者f1()並確保您的參數爲有效

這將工作:

struct node *you = malloc(sizeof(struct node)); 
if (you) 
{ 
    f1(you); 
    free(you); 
} 

正如本:

struct node me; 
f1(&me); 

這是不行的

struct node *me; 
int f1(me); 
+0

...談論失蹤的小事情。我不敢相信我那樣做了 - ><非常感謝你! –

+0

@AustinLeigh比你想象的更頻繁。 – WhozCraig

0

一些觀察注意:

  1. sizeof(char)是一個定義。

  2. 建議調用malloc的方法是避免強制轉換以及sizeof從被分配的指針中推斷出類型。 (見下文)

  3. 避免使用名稱(如new)作爲您的標識符(儘可能)。

  4. 當您完成後,請記住freestring成員node

要精心#2,見下文 -

struct MyType *foo; 
foo = malloc(n * sizeof *foo); /* allocate n elements where n > 0 */ 

出於某種原因,如果你選擇了富是一些其他類型的,在malloc電話少了一個線,你不用擔心。另外,如果你忘記包含stdlib.h,編譯器會讓你知道它。