構造体の最後のメンバー配列が0要素の意味を定義する

26084 ワード

配列本義では動的拡張はサポートされていませんが、構造体の最後のメンバー配列を0要素として定義することで、C言語の配列拡張を巧みに実現できます.ただし、ポインタとして定義されている場合は、メモリを個別に申請し、動的にコピーする必要があります.
  1. struct MyData
  2. {
  3. int nLen;
  4. char data[ 0];
  5. };
,data ; ; MyData , ( , data ); C 。
          :
         struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData )+strlen(str))
          p->data str。
          :
  1. #include
  2. using namespace std;
  3. struct MyData
  4. {
  5. int nLen;
  6. char data[ 0];
  7. };
  8. int main()
  9. {
  10. int nLen = 10;
  11. char str[ 10] = "123456789";
  12. cout << "Size of MyData: " << sizeof(MyData) << endl;
  13. MyData *myData = (MyData*) malloc( sizeof(MyData) + 10);
  14. memcpy(myData->data, str, 10);
  15. cout << "myData's Data is: " << myData->data << endl;
  16. free(myData);
  17. return 0;
  18. }



Size of MyData: 4
myData's Data is: 123456789         
, , sizeof(struct Mydata) = 4。
         malloc 14 , 14 , struct INFO , 4 Mydata , “123456789”

  1. struct MyData
  2. {
  3. int nLen;
  4. char data[ 0];
  5. };
,data ; ; MyData , ( , data ); C 。
          :
         struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData )+strlen(str))
          p->data str。
          :
  1. #include
  2. using namespace std;
  3. struct MyData
  4. {
  5. int nLen;
  6. char data[ 0];
  7. };
  8. int main()
  9. {
  10. int nLen = 10;
  11. char str[ 10] = "123456789";
  12. cout << "Size of MyData: " << sizeof(MyData) << endl;
  13. MyData *myData = (MyData*) malloc( sizeof(MyData) + 10);
  14. memcpy(myData->data, str, 10);
  15. cout << "myData's Data is: " << myData->data << endl;
  16. free(myData);
  17. return 0;
  18. }



Size of MyData: 4
myData's Data is: 123456789         
, , sizeof(struct Mydata) = 4。
         malloc 14 , 14 , struct INFO , 4 Mydata , “123456789”