如何是错的,请指出。

Jesin 2004-09-15 02:28:57
以下代码在VC6++下编译、执行为何报错?

#include "stdafx.h"
#include "iostream.h"
#include "string.h"

int main(int argc, char* argv[])
{
char *a=NULL;
a=new char(10);
strcpy(a,"hello");
cout<<a<<endl;
delete a; //出错的地方
return 0;
}
...全文
102 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
MN归来 2004-09-15
  • 打赏
  • 举报
回复
\\供你参考一下,接分
#include <iostream>
#include <string.h>
using namespace std;

int main( int argc, char*argv[] )
{
char *a = new char[10];

if ( a == NULL ) {
cout << " can't allocate more memory,terminating.\n";
return;
}

strcpy(a,"hello");
cout << a << endl;
delete []a;

return 0;
}
zhaotao0982 2004-09-15
  • 打赏
  • 举报
回复
//#include "stdafx.h" //去掉这个头文件
#include "iostream.h"
#include "string.h"

int main(int argc, char* argv[])
{
char *a=NULL;
a=new char[10]; //改动这里
strcpy(a,"hello");
cout<<a<<endl;
delete a; //出错的地方
return 0;
}
248406869 2004-09-15
  • 打赏
  • 举报
回复
to:pressman(GCC) ( )
你的程序缓冲区溢出了。看来linux也不太稳定,竟然没core dump.

wxfnj 2004-09-15
  • 打赏
  • 举报
回复
#include "iostream.h"
#include "string.h"

int main(int argc, char* argv[])
{
char *a=NULL;
a=new char[10];
strcpy(a,"hello");
cout<<a<<endl;
delete [] a;
return 0;
}
通过
pressman 2004-09-15
  • 打赏
  • 举报
回复
/*Test in GNU CC(Linux)
* Test1.c
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
char *a=NULL;

a=malloc(5*sizeof(char));

if (!a)
{
printf("Memory request faily!\n");
exit(1);
}

strcpy(a,"hello");
printf("%s",a);
printf("\n");

free(a);

return 0;
}

hello
248406869 2004-09-15
  • 打赏
  • 举报
回复
搂主
char *a=new char(10);
delete a;
没有错,他是分一个字节把它初始化为10;
按你的定义strcpy(a,"hello");错了缓冲区溢出了。
你应定义为:
char *a=new char[10];
delete[] a;
nicknide 2004-09-15
  • 打赏
  • 举报
回复
darkstar21cn(星之魄)(我是你的)
你试试一下下面的代码就知道了
a = new char (65);//
cout << a << endl; //打印出a来


呵呵,不一定只出来一个a,有可能什么怪东西都出来了……因为这里a是一个char*,所以当成字符串打印,但是a+1不一定是0(不知道什么地方是0呢),所以不会那么快结尾,应该如我前面讲的cout<<*a<<endl;

不过,你错误的原因还是krfstudio所说,是因为写逸出,所以在DEBUG版本中的回收内存的时候,被捕获到错误了,于是引发一个运行时的异常(或者断言),导致错误
修改方法可以按 darkstar21cn(星之魄)(我是你的) 所说,该成
char* a = new char[10];
//或者是 char* a = operator new (10);
//那释放的时候就是 operator delete (a);
//do something
delete []a;
cxc014 2004-09-15
  • 打赏
  • 举报
回复
我觉得可以这样写;
楼主用的是VC6吧,我在DEV-C++下调试没错
VC是重写了new和delete的,所以,在VC下有错;
nicknide 2004-09-15
  • 打赏
  • 举报
回复
还是 krfstudio() ( ) 仔细……咳,这个就是我天天晚上4点钟睡的害处……
darkstar21cn 2004-09-15
  • 打赏
  • 举报
回复
你试试一下下面的代码就知道了
a = new char (65);//
cout << a << endl; //打印出a来
darkstar21cn 2004-09-15
  • 打赏
  • 举报
回复
a=new char(10);
表示用10来初始化a,就是a只有1Byte
a=new char[10];
才是生成一个10Byte的空间
nicknide 2004-09-15
  • 打赏
  • 举报
回复
运行时错误吗?楼主?

我看象上面一行代码有问题啊:
cout<<a<<endl;
你改成:
cout<<*a<<endl;
看看
krfstudio 2004-09-15
  • 打赏
  • 举报
回复
从语法上来说,“delete a;”应该是没有错误的,上面的代码在 VC7.0 中可以通过编译,但是代码还是有问题的,“a=new char(10)”只分配了一个字节的内存,后面的“strcpy(a,"hello");”可能导致非法内存访问。
wwwooowww 2004-09-15
  • 打赏
  • 举报
回复
#include "iostream.h"
#include "string.h"

int main(int argc, char* argv[])
{
char *a=NULL;
a=new char[10];//这样才能new出足够的空间。可以支持后面的拷贝
strcpy(a,"hello");
cout<<a<<endl;
delete a;
return 0;
}

你的a=new char(10);,系统所做的是:new一个字节,将该字节的内容赋值为asc码的10。

wwwooowww 2004-09-15
  • 打赏
  • 举报
回复


是a=new char[10];
而不是:
a=new char(10);

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧