0
点赞
收藏
分享

微信扫一扫

SQL MAX() 函数深入解析

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

这个效果和柔性数组的效果是一样的!!

那么柔性数组的好处在哪?

举报

相关推荐

0 条评论