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