<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. C語言

    C語言不定長消息之柔性數組

    時間:2025-02-13 09:42:58 C語言 我要投稿
    • 相關推薦

    C語言不定長消息之柔性數組

      導語:C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。下面我們來看看C語言不定長消息之柔性數組,希望對大家有所幫助。

      C語言不定長消息之柔性數組:柔性數組:數組大小待定的數組。C語言中結構體最后一個元素可以是大小未知的數組。C語言可以由結構體產生柔性數組。

      柔性數組的結構如何只能堆上生成,柔性數組是C99的擴展,簡而言之就是一個在struct結構里的標識占位符(不占結構struct的空間)

      在游戲前后端交換的過程中,經常會用到變成的消息體,因為有的內容的大小是位置的,例如一條微博,微博的內容大小是未知的。

      一般的做法是定義一個char*類型的指針,然后指定其長度,代碼如下:

    1
    2
    3
    4
    typedef struct{          
       unsigned len;          
       char* pData;          
    }Msg;          

      使用時:

    1
    2
    3
    4
    5
    6
    7
    8
    char str[] = "hello world!";          
    unsigned len = sizeof(str);          
    Msg* m = (Msg*)malloc(sizeof(Msg)+len*sizeof(char));          
    m->len = len;          
    m->pData = (char*)(m+1);          
    memcpy(m+1, str, len);          
    printf("%d, %s ", m->len, m->pData);          

      有沒有覺得時機上char* pData很多余呢?

      因為數據時機的存儲位置在m+1,我們可以直接得到這個指針,而不需要重新定義一個char* pData來報錯這個位置。

      這樣帶來了另一個問題就是,訪問不方便,我們不能用結構體成員的方式來訪問了,可以使用柔性數組,且看:

    1
    2
    3
    4
    typedef struct{          
       unsigned len;          
       char data[];          
    }Message;          

      使用起來就是這樣

    1
    2
    3
    4
    5
    Message* msg = (Message*)malloc(sizeof(Message) + len*sizeof(char));          
    msg->len = len;          
    memcpy(msg->data, str, len);          
    printf("%d, %s ", msg->len, msg->data);          
    free(msg);          

      來分完整代碼對比下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    typedef struct{          
       unsigned len;          
       char* pData;          
    }Msg;          
    typedef struct{          
       unsigned len;          
       char data[];          
    }Message;          
    // test for 0 size array          
    #include <stdio.h>          
    #include <stdlib.h>          
    #include <string.h>          
    #include "array0.h"          
    int main()          
    {          
       char str[] = "hello world!";          
       unsigned len = sizeof(str);          
       // 普通用法          
       Msg* m = (Msg*)malloc(sizeof(Msg)+len*sizeof(char));          
       m->len = len;          
       m->pData = (char*)(m+1);          
       memcpy(m+1, str, len);          
       printf("%d, %s ", m->len, m->pData);          
       free(m);          
       // 柔性數組          
       Message* msg = (Message*)malloc(sizeof(Message) + len*sizeof(char));          
       msg->len = len;          
       memcpy(msg->data, str, len);          
       printf("%d, %s ", msg->len, msg->data);          
       free(msg);          
       system("pause");          
       return 0;          
    }</string.h></stdlib.h></stdio.h>          

      附自己測試代碼

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include <iostream>          
    using namespace std;          
    typedef struct{          
       unsigned len;          
       char* pData;          
    }Msg;          
    typedef struct{          
       unsigned len;          
       char pData[];          
    }Msg1;          
    int main(void)          
    {          
       Msg m;          
       cout << sizeof(m) << endl; //16          
       cout << &m << endl;   // x          
       cout << &(m.len) << endl; //x          
       cout << &(m.pData) << endl;  //x+8          
       //          
       cout << "-----" << endl;          
       Msg1 m1;          
       cout << sizeof(m1) << endl; //4          
       cout << &m1 << endl;   // x          
       cout << &(m1.len) << endl; //x          
       cout << &(m1.pData) << endl;  //x+4          
       return 0;          
    }</iostream>          

      結果

    【C語言不定長消息之柔性數組】相關文章:

    C語言的數組與函數10-23

    C語言數組教程08-31

    什么是C語言數組10-03

    C語言數組與指針詳解08-15

    C語言數組的定義及引用08-05

    C語言數組方法08-06

    C語言數組元素的查詢08-02

    C語言指針數組的概念07-19

    C語言數組入門學習10-22

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人