返回信息流在vs2005里面
char *p=new char;
char *n="abcd";
strcpy(p,n);
为什么这样打印p可以正确打印出abcd呢?
new char应该是只分配了一个char的空间,他怎么能接收abcd啊?
另外问一个问题
new char(10)和new char[10]有什么区别吗?
在删除new char(10)的空间是delete []还是delete?
[em21]
这是一条镜像帖。来源:北邮人论坛 / cpp / #9077同步于 2008/7/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
问一个指针的问题~~
perfectfan
2008/7/2镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
第一个问题,
strcpy它得原理,在林锐得 高质量c编程指南里有:
char *strcpy(char *des, const char* src);
首先check des是否为null;
然后 *des++ = *src++;
所以p不是空的,通过了check,然后
*p++ = *n++:
【 在 perfectfan (nicky) 的大作中提到: 】
: 在vs2005里面
: char *p=new char;
: char *n="abcd";
: ...................
new char(10)就是 一个char字符 ansi码是10
new char[10]就是分配10个sizeof(char)得空间,也就是分配一个元素个数为10得字符数组
所以new char(10) 释放得时候 应该是delete ;
【 在 perfectfan (nicky) 的大作中提到: 】
: 在vs2005里面
: char *p=new char;
: char *n="abcd";
: ...................
对啊,就是des++了,但是new char只是给在内存中找到了一个能存放一个char的空间
如果进行++然后赋值的话,难道不会引起错误?
另外如果是char *p=new char[2];
那么用strcpy就会出错。看那个strcpy,他并不知道这段空间的大小,超过了2个char,他还是可以继续赋值~
另外LS的,为什么new char可以,new char[n] n小于src的长度,这样就会有错?
~~~莫名其妙
【 在 purevirtual 的大作中提到: 】
: 第一个问题,
: strcpy它得原理,在林锐得 高质量c编程指南里有:
: char *strcpy(char *des, const char* src);
: ...................
这我就不知道了,个人猜想是:
strcpy里是根据*des是否为 \0 来判断是否到达 字符串des末尾;
【 在 perfectfan (nicky) 的大作中提到: 】
: 对啊,就是des++了,但是new char只是给在内存中找到了一个能存放一个char的空间
: 如果进行++然后赋值的话,难道不会引起错误?
: 另外如果是char *p=new char[2];
: ...................
des是不是到了\0是跟src相关的~
跟des的空间并没有关系~
用strcpy是不是就会因此会有很不安全的因素,就是可能赋值成功了,但是程序是有问题的?
【 在 purevirtual 的大作中提到: 】
: 这我就不知道了,个人猜想是:
: strcpy里是根据*des是否为 \0 来判断是否到达 字符串des末尾;
【 在 perfectfan 的大作中提到: 】
: des是不是到了\0是跟src相关的~
: 跟des的空间并没有关系~
: 用strcpy是不是就会因此会有很不安全的因素,就是可能赋值成功了,但是程序是有问题的?
strcpy是不会判断目的地址是否足够长的
无论目标地址是在堆还是在栈上,都能直接赋过去,它本身根本不会判断是不是写越界了,所以才会有缓冲区溢出
这个,不是strcpy得不安全,是指针。。。
【 在 perfectfan (nicky) 的大作中提到: 】
: des是不是到了\0是跟src相关的~
: 跟des的空间并没有关系~
: 用strcpy是不是就会因此会有很不安全的因素,就是可能赋值成功了,但是程序是有问题的?
: ...................