c语言设置长数组,C语言变长数组

#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;

}

7f8c523f1e74ccb11642cabd2cfc5884.png

根据结果可以得出的信息

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

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

实现的前提:

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

原文:https://www.cnblogs.com/s3320/p/11837463.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值