C/C++中内存的开辟
但是其实要更加细分,区域可以分为:
实际上普通的局部变量是在栈区分配空间的,栈区的特点是在上面创建的变量出了作用域就销毁。
但是被static修饰的变量存放在数据段(静态区),数据段的特点是在上面创建的变量,直到程序 结束才销毁 所以生命周期变长。
柔性数组:
柔性数组大家可能都没听说过,但是它是真实存在的,前面介绍过结构体的大小应该怎么去计算,这里涉及到大小的计算:
例如:
#include<stdio.h>
typedef struct pc
{
char a;
int b;
int arr[];
}pc;
int main()
{
printf("%d", sizeof(pc));
return 0;
}
这组代码的结果应该是什么?
前面介绍了结构体大小的计算:
例如:
#include<stdio.h>
typedef struct pc
{
char a;
int b;
}pc;
int main()
{
printf("%d", sizeof(pc));
return 0;
}
他的大小是:
大小是8个字节。
此时在结构体中大小未知的数组就被称之为柔性数组!!
那么柔性数组的大小究竟是多少呢?
柔性数组的特点:
代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct pc
{
char a;
int b;
int arr[];
}pc;
int main()
{
pc* ptr = ( pc*)malloc(sizeof(pc) + 12);
if (ptr == NULL)
{
perror("malloc");
return 1;
}
return 0;
}
当然结构体我们也可以这样写(不用柔性数组):
int main()
{
pc* ptr = (pc*)malloc(sizeof(pc) + 12);
if (ptr == NULL)
{
perror("malloc1");
return 1;
}
ptr->arr = malloc(12);
if (ptr->arr == NULL)
{
perror("malloc2");
return 1;
}
int* pr = (int*)realloc(ptr->arr, 8);
if (pr != NULL)
{
ptr->arr = pr;;
}
else
{
perror("realloc");
return 1;
}
free(ptr);
ptr = NULL;
free(pr);
pr = NULL;
return 0;
}
这个效果和柔性数组的效果是一样的!!
那么柔性数组的好处在哪?