1. 程式人生 > >結構體與char型的轉換

結構體與char型的轉換

結構體:
#defined MAX_LENGTH 200
typedef struct _TEST_EXAMPLE
{
    char name[MAX_LENGTH+1];
    int age;
} test_example;

結構體的首位置轉換成Char指標,比如有10位同學:
test_example *te = (test_example *)malloc(sizeof(test_example) * 10);
//...結構體讀取資料..
for (size_t i = 0; i < 10; i ++)
{
te[i].name = student[0];
te[i++].age = student[1];
}
char *result = (char *)te;

當用指標(char *)result做了一些操作後,最後要將Char*指到的首位和長度還原成結構體陣列(結構體陣列在記憶體中是連續的);列印結構體如下:
方法一:
size_t value_length = sizeof(test_example) * 10;
for (size_t i = 0; i < value_length; i ++)
{
    printf("%s\t", ((test_example *)(result + i))->name);
    printf("%d\n", ((test_example *)(result + i))->age);
    i += sizeof(test_example) - 1;
}

另外一種方法:
test_example *tmp = (test_example *)result;
for (size_t i = 0; i < value_length / sizeof(test_example); i ++)
{
    printf("%s\t%d\n", (tmp + i)->name, (tmp + i)->age);
}

看起來非常簡單,起先我是使用純指標去擷取每個name和age的位置,但是結構體有個問題,隨平臺不同,結構體每個物件中所佔用的空間也不一樣,一般是int的整數倍,比如char a[10]是結構的唯一成員變數,其實相當於結構體仍然需要佔用12個位元組,具體bool這種型別是否也是int的整數倍,需要進行測試確認;所以最好的辦法還是使用直接OO的方法指定,雖然指標也是一種OO。