C99中的柔性数组和其内在本质

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <stdlib.h>
 
// 定义一个包含柔性数组的结构体
struct flex_array {
    int size;
    int data[0];
};
 
int main() {
    int i;
    int size = 10;
 
    // 动态分配内存
    struct flex_array *arr = malloc(sizeof(struct flex_array) + sizeof(int) * size);
    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return -1;
    }
 
    // 设置数组大小
    arr->size = size;
 
    // 使用柔性数组
    for (i = 0; i < arr->size; i++) {
        arr->data[i] = i;
    }
 
    // 打印柔性数组的内容
    for (i = 0; i < arr->size; i++) {
        printf("%d ", arr->data[i]);
    }
    printf("\n");
 
    // 释放内存
    free(arr);
 
    return 0;
}

  

输出:0 ~ 9

printf("sizeof(struct flex_array)=%d\n", sizeof(struct flex_array)); 输出是4,说明从效果看data在数组中的长度就是0

 

反汇编看了下:

看来本质就是编译器的一个trick而已。

arr->data指向的地址就是数组起始地址:

从数组的汇编本质来说,编译器的这种行为是非常合理且自然的。

 

posted @   bonelee  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2019-10-24 splunk dga
2017-10-24 neat算法——本质就是遗传算法用于神经网络的自动构建
2017-10-24 lucene LZ4 会将doc存储在一个chunk里进行Lz4压缩 ES的_source便如此
点击右上角即可分享
微信分享提示