2014-11-05 35 views
-1

我想創建一個初始大小爲len的新的intarr_t,但我從來沒有用typedef'ed變量處理這類問題。在函數中對typedef創建的變量使用malloc

我的問題是intarr_create()應該分配數組空間,然後返回一個指向它的指針,如果malloc成功或者指向NULL,如果我失敗了。我怎樣才能解決這個問題?

此外,爲什麼函數中有一個*符號?

這裏是我的代碼:

#include <stdio.h> 

typedef struct { 
    int* data; 
    unsigned int len; 
} intarr_t; 

intarr_t* intarr_create(unsigned int len) { 
    //intarr_t with initial size len 
    intarr_t = (int *) malloc(len); // not working here, can someone explain why? 
    if(intarr_t != NULL) { 
     return intarr_t; 
    } else { 
     return NULL; 
    } 
} 

int main() { 
    int len = 15; 
    int h = intarr_create(len); 
    printf("%d\n", h); 
    return 0; 
} 
+0

注意,['typedef''ing結構](http://stackoverflow.com/a/4566358/1757964)是C語言的最壞,最可怕的弊端之一。如果你可以避免使用它,請這樣做。 – APerson 2014-11-05 19:27:33

+1

您正嘗試在'main'的函數調用中將指針類型分配給非指針類型。你也可以直接返回'malloc'的結果,如果你打算在失敗時返回NULL,[並且不要強制轉換'malloc'的結果](http://stackoverflow.com/questions/605845/do -i-cast-of-malloc) – IllusiveBrian 2014-11-05 19:28:05

+0

@APerson這有點極端,它有一些優點和很少的缺點 – 2014-11-05 19:51:15

回答

2

它不工作,因爲你沒有給你的變量的名稱。另外,int*intarr_t不是相同的類型,所以除非更改演員表,否則將會出現類型不匹配。

+0

改變演員意味着什麼? – BeginnerC 2014-11-05 19:30:05

+0

@BeginnerC你寫了'(int *)malloc(len)'。 '(int *)'被稱爲轉換;它將'malloc()'調用的類型從'void *'(指向任何內容)改變爲'int *'(指向整型變量的指針)。但是你沒有一個整數變量,所以你需要把它改成'(intarr_t *)'。您還需要將該變量放入指針中。你最終會得到類似'intarr_t * result =(intarr_t *)malloc(len);' – Kevin 2014-11-05 19:33:56

+0

感謝您的快速響應,但我有點困惑和原諒我的理解緩慢,但因爲我想返回一個指向新分配的intarr_t如果成功(即內存分配成功,我會返回結果嗎?) – BeginnerC 2014-11-05 19:40:17

1

重寫你的函數到這一點:

intarr_t* intarr_create(unsigned int len) 
{ 
    intarr_t *result; 

    result = (intarr_t *)malloc(sizeof(intarr_t)); // allocate memory for struct 
    if(result != NULL) 
    { 
     result->data = (int *)malloc(len * sizeof(int)); // allocate memory for data 
     result->len = len; 
     if (result->data == NULL) 
     { 
      /* handle error */ 
     } 
    } 
    else 
    { 
     /* handle error */ 
    } 

    return (result); 
} 

你必須做一個「雙」的malloc得到它的權利。首先,您必須爲intarr_t分配內存,如果成功,則必須爲數據陣列分配內存。

此外malloc返回一個void *必須被轉換爲正確的指針類型(應該是一個警告或者甚至可能與一些編譯器錯誤)。

+0

這將返回一個intarr_t結構數組,其中沒有爲數據分配內存。我不認爲這是OP想要的。 – Daniel 2014-11-05 19:33:07

+0

@Daniel根據問題,這正是函數應該做的('我的問題是,intarr_create()應該分配數組空間,然後在malloc成功時返回一個指針,如果失敗則返回一個指向NULL的指針。 )...... huups對不起,錯過了一下! – 2014-11-05 19:40:45

0

您的intarr_create函數存在一些問題。首先,你需要命名你的intarr_t變量。現在,除了你的intarr結構之外,你還需要爲實際的整數數組分配內存。請記住,您必須致電刪除兩次才能銷燬此對象。一旦在數據上,一次在實際結構本身。

intarr_t* intarr_create(unsigned int len) 
{ 
    intarr_t* array = (intarr_t*)malloc(sizeof(intarr_t)); 
    array->data = (int*)malloc(len * sizeof(int)); 

    return array; 
}