2011-01-20 47 views
1

我工作的一個概率,並作爲它的一部分遇到了follwing類型的問題...鑄字字符的結構類型

對於FOLL代碼

#include<stdio.h> 
#include<stdlib.h> 
typedef struct sample 
{ 
    int a; 
    char b; 
}sample; 

int main() 
{ 
    char *buf; 

    buf = (char *)malloc(sizeof(char)*sizeof(sample)); 

    buf = ((sample *) buf); 
    buf->a = 10; 
    buf->b = 'm'; 
    printf("%d\n",(buf)->a); 
    printf("%c\n",(buf)->b); 

    return 0; 
} 

編譯時錯誤是:

example.c:16:錯誤:在一些請求構件a' in something not a structure or union example.c:17: error: request for member b」不是一個結構或聯合

這是因爲我不能強制轉換的較低數據類型到h更高的類型.. ??

我想提前

到位的malloc使用釋放calloc使得contiguos塊可分配,但無濟於事..

幫我看看這個轉換的邏輯缺陷...

謝謝

+0

固定格式爲您使用4個空格的縮進代碼。 – wich 2011-01-20 09:58:30

回答

0

BUF的類型不跟投改變,你需要添加一個額外的變量:

char* buf; 
sample* s; 

buf = malloc(sizeof(sample)); 
sample = (sample*)buf; 

sizeof(char)完全蘇佩順便說一下,它是1的定義。

4

Yopu應該改變

char *buf;  
buf = (char *)malloc(sizeof(char)*sizeof(sample)); 

sample *buf;  
buf = (sample *)malloc(sizeof(sample)); 

因爲聲明的buf爲char *防止明白你的意圖編譯器(指向一個樣本結構)。

2

buf = ((sample *) buf);不會做任何事情。變量buf仍然是char*類型。

sample* sample = (sample*)malloc(sizeof(sample)); 
sample->a = 10; 
sample->b = 'm'; 
printf("%d\n",(sample)->a); 
printf("%c\n",(sample)->b); 

更像是你想要的。

0

buf的類型仍然是char *。 Casting不會更改接收變量的類型。你在這裏做的演員基本上沒有意義 - 指針的價值不受它指向的影響。內存是內存。

要解決此問題,請將buf的類型更改爲sample *

若要進一步修復,請從malloc和其後的「重鑄」buf中刪除。