示例:
#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指向的地址就是数组起始地址:
从数组的汇编本质来说,编译器的这种行为是非常合理且自然的。
标签:arr,其内,int,C99,struct,数组,柔性,array,size From: https://www.cnblogs.com/bonelee/p/17784819.html