c99变长数组_C语言变长数组

拼搏现实的明天。 2023-01-08 06:23 219阅读 0赞

#include

#include

#include

typedef struct Variable_length_array

{

size_t len;

char Arrary[0];

}CString;

int main(void)

{

printf(“In stack\n”);

CString arr;

printf(“&a : %p\n”, &arr);

printf(“&a.len : %p\n”, &(arr.len));

printf(“&aArrary : %p\n”, &(arr.Arrary));

printf(“sizeof(arr) : %lu\n”, sizeof(arr));

printf(“sizeof(CString) : %lu\n”, sizeof(CString));

char pStr[] = “Variable_length_array”;

size_t len = strlen(pStr);

CString *p = (CString*)malloc(sizeof(CString) + len);

p->len = len;

strcpy(p->Arrary,pStr);

printf(“\nIn heap\n”);

printf(“&p : %p\n”,p);

printf(“&p->len : %p\n”,&(p->len));

printf(“&p->Array : %p\n”, &(p->Arrary));

printf(“sizeof(*p) : %lu\n”, sizeof(*p));

printf(“sizeof(CString) : %lu\n”, sizeof(CString));

printf(“\nTest p + sizeof(CString)\n”);

printf(“sizeof(CString*) : %lu\n”, sizeof(CString*));

printf(“p+sizeof(CString) : %p\n”, p+sizeof(CString));

printf(“(char*)p+sizeof(CString) : %p\n”, ((char*)p+sizeof(CString)));

printf(“\nTest Get the struct data\n”);

char szBuffer[64] = {0};

// memcpy(szBuffer, p->Arrary, p->len); //ok

// memcpy(szBuffer, p+sizeof(CString), p->len); //未到达要求

memcpy(szBuffer, (const void*)p+sizeof(CString), p->len); //ok

// memcpy(szBuffer, (const void*)p+sizeof(CString), strlen((const void*)p+sizeof(CString))); //ok

printf(“szBuffer : %s\n”,szBuffer);

free(p);

return 0;

}

![Image 1][]

根据结果可以得出的信息

结构体的地址和结构体中第一个元素的地址是相同的

Array在结构体中“不占空间”

实现的前提:

数组必须在结构体的最后,因为malloc的是整个结构体,如果数组不在最后,申请的空间会覆盖后面元素的空间

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,219人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数组VLA

    C99标准中,支持变长数组,即方括号\[\]中可以用为一个变量,但是很多编译器并不能很好地支持。 c++11标准中,不支持变长数组,即方括号\[\]中必须为常量表达式。 c

    相关 数组

    在 C89 和 C++ 中, 一个数组的尺寸必须是一个整型常量表达式以便于在编译时计算大小. 在 C99 中, 最新的 ANSI/ISO C 标准, 该规则被放松了 -- 你