2014-10-22 70 views
0

我得到了這個錯誤信息:通過x的參數1使指針中的整數沒有強制轉換。當我傳遞一個int並且完美工作時,我也以同樣的方式完成了。但是當我用char來做這件事的時候,我得到了這個錯誤。代碼:爲char分配額外的內存,但不是爲已分配的結構中的int分配額外內存?

struct x { 
    char y; 
} 

struct x *make(char y) 
{ 
    struct x *n = malloc(sizeof(struct x)); 
    n->y = y; 
    return n; 
}; 

int main(void) 
{ 
    make("y"); 
    return 0; 
} 

我修正了將char改爲char *並使用strcpy的錯誤。所以它完美地工作。但我不明白爲什麼我必須這樣做。我用malloc(sizeof(struct x))爲整個結構分配內存?所以爲什麼我必須爲char分配額外的內存。這似乎很奇怪。我可能有誤解嗎?那麼爲什麼是這種情況。

+0

請縮進代碼 – 2014-10-22 09:31:55

回答

4
"y" 

是一個字符串文字。這是一個指向空字符結尾數組的指針。

你的函數接收單個字符,所以你需要通過字符文字:

'y' 

爲了讓您的調用函數make編譯。


您在最後一段中描述的更改完全改變了結構。它將成員從單個字符(內聯分配)更改爲指向以空字符結尾的字符數組的指針。而後一個變體需要單獨分配字符數組。這可能是你想要做的,只有你知道。但是您必須瞭解單個字符與指向以空字符結尾的字符數組的指針之間的區別。

因此,考慮問題的該結構的版本:

struct x { 
    char y; 
} 

你動態分配一個結構是這樣的:

struct x *n = malloc(sizeof(struct x)); 

在這一點上你做。這個結構的所有成員都由這個單獨的調用分配。

您在這個問題討論了結構的替代版本是這樣的:

struct x { 
    char *y; 
} 

同樣,你會分配結構是這樣的:

struct x *n = malloc(sizeof(struct x)); 

,這再次分配所有成員的結構。所以分配了指針n->y。但缺少的一步是n->y尚未初始化。通常會涉及到malloc的進一步呼叫。要做到這一點的函數可能是這樣的:

struct x *AllocStruct(const char *y) 
{ 
    struct x *s = malloc(sizeof *s); 
    s->y = malloc(strlen(y) + 1); 
    strcpy(s->y, y); 
    return s; 
}; 

然後釋放,你會做這樣的結構:

void FreeStruct(const struct x *s) 
{ 
    free(s->y); 
    free(s); 
};