示例:
#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指向的地址就是数组起始地址:
从数组的汇编本质来说,编译器的这种行为是非常合理且自然的。