大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
new是C++中用于动态内存分配的运算符,在C语言中一般使用malloc函数。
创新互联公司专注于企业全网营销推广、网站重做改版、离石网站定制设计、自适应品牌网站建设、H5页面制作、电子商务商城网站建设、集团公司官网建设、外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为离石等各大城市提供网站开发制作服务。
有三种用法:new operator、operator new、placement new
1)new operator:
new operator是最常见的用法,如 Emp* e1 = new Emp;(Emp是一个类) 这里new有两种作用:分配空间、初始化对象(调用了构造函数)
2)operator new:
operator new作用是只分配空间,不调用构造函数,如:Emp* e2 = (Emp*)operator new(sizeof(Emp));
3)placement new:
placement new作用是在已分配好的空间上初始化对象,不分配空间,调用拷贝构造函数,如:new ((void *)e2) Emp(*tb1);
newcopy函数没什么问题。
主函数有问题。
#includestdio.h
void newcopy(char *new,char *old);
void main(){
char *new,*old,a[1000];
int m,j;
//printf("要输入多少个字符:");//这里是没意义的。 输入字符个数不需要说明。 如果是多个字符串,那么下面循环要包含到输出部分。
//scanf("%d",m);
printf("请输入字符串:");
//for(j=0;jm;j++)
gets(a);
old=a;
new=a;
newcopy(new,old);
printf("输出运行后的字符串:%s\n",a);
}
void newcopy(char *new,char *old){
int j=0;
for(;*old!='\0';++old)
if((*old)'z'||(*old)'a')
{
*(new+j)=*old;
j++;
}
*(new+j)='\0';
}
在纯粹C编译器下,用new作函数名是可以的,但在与C++兼容的编译器下,是不可能通过编译的,因为new是C++的申请内存操作符,属保留字,不能由用户用作标识符。这里将new改为mynew,举例代码如下:
//#include "stdafx.h"//If the vc++6.0, with this line.
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
char *mynew(int n){
char *p;
if(p=(char *)malloc(n))
return p;
else return NULL;
}
int main(void){
char *p=mynew(20);//申请20个连续字节空间
if(p){//若申请成功
strcpy(p,"1234567890");//向申请的空间写入字符串
printf("%s\n",p);//打出来看看
free(p);//释放申请的空间
}
else printf("Application memory failure...\n");
return 0;
}
C语言中一个完整的函数由函数首部和函数体构成,而且定义函数时两者都是必不可少的。
函数定义的一般形式如下:
类型标识符
函数名(形参表列)
//
这是函数首部
//
以下{
}内的是函数体
{
说明部分
执行部分
}
举例说明如下:
// 定义一个不带返回值的函数
// 函数功能:输出形参的值
void fun(int a, int b)
{
printf("%d, %d\n", a, b);
}
// 定义一个带返回值的函数
// 函数功能:返回2个整数数的最大值
int fun(int a, int b)
{
return ab ? a : b;
}
首先是new函数的疑问,*newp是newbuf数组的首地址,那是不是不管newp变成了什么都会指向newbuf首地址,那么if判断是不是永远都是成立的?
并不是. 注意newp在申请成功时,是newp+=n;
也就是根据申请的n值, 每次newp是移动的, 比如, 先申请了500个字节,那么此时newp=newbuf+500, 再申请512个字节,就会导致判断不成立,返回NULL.
同时,即使是newp=newbuf时, 如果n大于1000, 那么一样会返回NULL.
然后是free函数的问题,是不是就是从p开始放入newbuf数组,使p之后的1000个位置都是空白的,以此达到清除内存的目的?
这里其实是让newp指向p, 也就是使得从p开始的内存又可以分配了.
对于free函数,参数p必须是new返回的值. 至于这个函数的详细功能,不需要深究,因为它是有问题的.
如果多次申请内存后, 再逐一释放,这个程序就会乱掉了.