首页 > 编程语言 > 详细

C语言变长数组

时间:2019-11-12 15:07:25      阅读:107      评论:0      收藏:0      [点我收藏+]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

技术分享图片

根据结果可以得出的信息

  1. 结构体的地址和结构体中第一个元素的地址是相同的
  2. Array在结构体中“不占空间”

 实现的前提:

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

C语言变长数组

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!