申请堆空间时出现的错误

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct foo{
	int a;	//4
	char b[6];	//8
	char *p;	//4
	char c[0];
};

#define EXPAND_MEM	15

int main()
{
	printf("size =%u\n",sizeof(struct foo));
	
	struct foo *pf = (struct foo*)malloc(sizeof(struct foo)+EXPAND_MEM*sizeof(int));
<span style="white-space:pre">	</span>/* 之前代码
<span style="white-space:pre">	</span>*<span style="white-space:pre">	</span><span style="font-family: Arial, Helvetica, sans-serif;">struct foo *pf = (struct foo*)malloc(sizeof(struct foo)+EXPAND_MEM);//这样后面赋值的时候就会越界</span><span style="font-family: Arial, Helvetica, sans-serif;">	</span>
<span style="white-space:pre">	</span>*/
	if(!pf){
		printf("there is not enough memory!\n");
		exit(EXIT_FAILURE);
	}
	strcpy(pf->b,"hello");
	printf("pf->b :%s,pf :%p\n",pf->b,pf);
	
	int i;
	for(i=0;i<EXPAND_MEM;i++){
		*(pf->c +i)=i;
	}
	#if 1
	printf("pf->b :%s,pf :%p\n",pf->b,pf);
	printf("pf->c=[");
	for(i=0;i<EXPAND_MEM;i++){
		printf("%d ",*((pf->c)+i));
	}
	printf("]\n");
	#endif

	pf->p = (char *)calloc(EXPAND_MEM,sizeof(char));
	if(!(pf->p)){
		printf("there is not enough memory!\n");
		exit(EXIT_FAILURE);
	}
	strcpy(pf->p,"I LOVE Linux");
	printf("pf->p %s\n",pf->p);

	free(pf->p);
	free(pf);
	return 0;
}


STM32微控制器内部并不直接提供用户访问物理内存的方式来分配所谓的“空间”;因此,谈论STM32的“空间大小”并没有直接意义。不过,我们可以通过了解STM32的资源分配、内存管理和编译选项来理解如何管理内存。 在STM32项目中,程序员通常会在自己的应用代码中负责内存的分配和释放。为了有效管理内存,尤其是用于动态内存分配的部分(即通常所说的""),常用的策略包括: 1. **手动内存管理**:在需要的候动态地分配内存,并在不再使用显式地释放它。这需要开发者有良好的内存管理习惯,避免内存泄漏。 2. **使用预分配的静态数组**:对于已知大小的数据结构,可以预先分配足够的内存空间,避免频繁的内存申请和释放操作。 3. **使用RTOS或其他并发工具**:实操作系统(RTOS)如FreeRTOS、X-Ware等通常提供内建的内存管理机制,允许更高效地管理内存并减少了程序员手工管理内存的需求。 4. **heap库函数**:一些IDE或库可能会提供基于STM32的应用程序特定的栈管理功能。例如,在Keil MDK或IAR EWARM等集成开发环境中,可能存在自定义的内存管理库,能够更好地适应STM32的应用场景。 关于具体的内存分配量或“空间”,则取决于你的应用程序需求以及所选的开发环境和编译配置。例如,在某些编译设置下,如果你为应用程序指定了较大的空间(如通过编译器选项),那么在运行就有更多的内存可用于动态分配;反之,则会限制可用的空间,减少可能因缺少内存而导致的错误(如内存溢出)。 考虑到STM32系列芯片资源有限,有效的内存管理尤为重要,不仅是为了性能考虑,也是为了保证系统稳定性和可靠性。在设计内存管理策略,应充分考虑系统的实际需求、处理器的资源限制以及预期的负载情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值