为什么这个c++小程序编绎无错,却不能运行??

为什么编译时没有错,却不能运行???
#include <iostream.h>
#include<string.h>

char *f(char a[]="Hello,",char b[]="world");
int main()
{
cout<<f()<<endl;
cout<<f("Hi,")<<endl;
cout<<f("Hi,","friend!");
}
char *f(char a[],char b[])
{
char*p=a,*q=b;
strcat(a,b);
return p;
}
不是一闪而过,是运行时windows报错。。。

呵呵... 楼上的说得好, 我来详细说说.

是strcat函数的问题. strcat函数可以连接两个字符串, 传入两个参数, 是指向要连接的两个字符串的指针.

但是它的第一个参数必须是一个字符串数组头地址, 即是一个分配了内存的, 拥有一定空间的指针. 但是f()无参数时默认建立的两个指针*a和*b都是指针变量, 没有自己的空间, 所以会发生内存错误.

用分配了20个字节空间的公共变量 str(这是字符串数组首地址指针) 代替没有分配内存的指针a就可以完成了! 请看程序:

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

char *f( char a[20]="Hello,", char b[]="world" );
char str[20];

int main()
{
cout << f() << endl;
cout << f("Hi,") << endl;
cout << f("Hi,","friend!");
return 0;
}

char *f(char a[], char b[])
{
strcpy( str, a );
strcat(str, b);
return str;
}

//原本还有第二种解法, 仔细想过后发觉第二种改法不行, 确实会导致内存泄漏, 所以删去了.
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-08-02
能编译就能运行,你没看见罢了,在程序末尾加一句getchar()就可以了,如果还不行你补充一下运行时的具体状况
第2个回答  2007-08-02
char*p=a,*q=b;
strcat(a,b);
return p;
请看这里,char*p=a,这句话,让分配了一个大小为a数组大小的内存,但是这个话strcat(a,b);把b接到了a后面,但是strcat这个函数是不会给a分配大小的,也就是说,你这里的函数执行好以后,你的内存溢出了,所以有错
还有你这个是函数重载么,对于你写的我不是很清楚,我也是个初学者~也只能帮你解释这个strcat函数的地方
第3个回答  2007-08-02
楼上的越改越错
p = new char[20]; //新加上去的, 给p分配内存
。。。
return p;
内存泄漏,外加系统有可能崩溃
看看 高质量C 那本书吧

为什么这个c++小程序编绎无错,却不能运行??
是strcat函数的问题. strcat函数可以连接两个字符串, 传入两个参数, 是指向要连接的两个字符串的指针.但是它的第一个参数必须是一个字符串数组头地址, 即是一个分配了内存的, 拥有一定空间的指针. 但是f()无参数时默认建立的两个指针*a和*b都是指针变量, 没有自己的空间, 所以会发生内存错误.用...

C++问题,编译无错,运行老是停止工作,求解答
static int j=1;\/\/\/静态变量 int i; ifstream input; input.open("a.txt"); for(i=0;i<4;i++) { input>>my_username[i]>>my_password[i]; } input.close(); for(i=0;i<4;i++) { if(strcmp(str1,my_username[i])==0 && strcmp(str2...

c语言编程,编译无错,运行出错
1 你所谓的运行时问题,即栈溢出(stack overflow), 解决方法是使用c语言的malloc函数(相当于C++的new操作符)在堆上分配内存(当然最后根据输出文件的答案来看,你确实数据给大了)2 逻辑问题,如楼上各楼所说:s[i]=s[i-1]+A[i];而不是s[i]=s[i-1]+s[i];你中学数学知识都忘了。。。

用devc++编译无错 可是无法正常运行
编译出错代表逻辑不出错,这种情况八九不离十是堆栈破坏导致的问题,请检查你的源代码

...了一个小程序但是Debug文件夹中的exe却不能运行,老是一摁回车键就...
c++的程序不是用Debug运行的,你编好的程序保存在.c文件里,就是图标是个C的,就像这个 你打开它,然后运行就好了。

visual C++问题,编译运行都没有错,但弹不出窗
程序已经运行完了是不会停留在DOS窗口的,在printf("hello world")后面加一句scanf("%d",&i);当然i要事先定义

c++在VC6.0中出现无法执行程序
1、VC++6.0上出现提示“无法执行程序”,很可能是创建工程和文件的时候选择错了,注意运行C和C++的是.cpp文件,不是.h。2、在创建工程的时候根据需要选择Win32 Console Application。3、只是一些简单的小程序的话,选择C++Source File创建源文件。然后在上面运行程序。4、首先,需要明白在一个工程文件...

我用C++编了个小程序,编好了却不知道怎么运行
什么意思 说清楚点 你用记事本编的?你可以安装Microsoft Visual C++ 6.0 然后打开程序 编译 链接 执行 或者是DEV-C++

一个C++小程序,为什么我的程序执行没反应,谢谢
在程序文件头前加#include<iostream> 再在return 0后加上system("pause");再次编译,即可弹出DOS窗口

Microsoft Visual C++ 6.0为什么程序编完绝对无错,点测试只是左下角有...
表示没有用过测试,一般就是编译完选择执行,或者想要知道程序具体是怎样运行的话对程序进行调试就好了。

相似回答
大家正在搜