最近在牛客网在做嵌入式笔试题,遇到new关键字,以下是我的总结。局部变量存放在栈中,在函数结束后自动释放。下面这题是一道嵌入式面试题一部分,找出以下错误。
#incude <stdio.h>
void *get1()
{
char buf[12]={"abc"};
return buf;
}
int main()
{
int *m;
m=get1();
memcpy(m,"aaa",3);
return 0;
}
1.首先get1函数里的数组是局部变量,存放在栈区,对应的内存在函数结束时就会被释放。因此返回的地址是无效的。调用这样的地址是严重错误的。
2.调用memcpy(m,“aaa”,3),向没有权限的无效内存空间存放数据是非法的。
3.指针最好初始化,野指针容易出现非法访问。
malloc
动态内存分配函数,经常用在为数组申请动态内存空间,分配一块连续的内存。在堆上进行动态内存分配,由程序员自己释放,free函数释放。
int *array=(int *)malloc (sizeof (int) *100)
//返回是int*类型,内存空间大小100个整型数据
int *array =(int *)malloc (1)
// 申请了一个字节的空间,如果向里面存放了一个整数的话
程序运行会报错
int *p;
p = malloc(sizeof(int));
//若 malloc的返回是void *; ;则将void *转化给了int *,这不合理
new
new在堆上进行分配动态内存,用于C++中,由程序员自己释放,删除数组delete []p,指针释放后,要将指针置空。
int *p;
p = new int; //返回类型为int *类型,分配的大
小为 sizeof(int)
p = new int[100]; //返回类型为int *
类型,分配的大小为sizeof(int) * 100 为 100个int字节