strcpy问题

来源:百度知道 编辑:UC知道 时间:2024/06/04 16:48:24
#include<isstream>
void GetMemory(char *p,int num)
{
p= (char *)malloc(sizeof(char)*num);
}
int main()
{
char *str=NULL;
GetMemory(str,100);
strcpy(str,"hello");
return 0;
}

结果是什么?都什么意思
运行结果是什么啊?

首先头文件应该包含
#include<stdlib.h> ,有malloc()的声明
#include<string.h>,strcpy()
这个小问题
这个程序并没有像你想的那样运行,能编译链接,但运行时崩溃

原因是这样的:
当传递str给GetMemory()时候:

首先:
给形参p开辟一块内存(四字节,指针),这块内存和实参变量所在(不是所指向)的内存是两个独立的内存,没有任何关系,先记住这个,后面会用到,形参num也分配,这个参数不是问题重点,就不多说了

其次:
虚实结合,把实参str中内容赋值到形参变量的内存区中(即,把NULL赋值到形参变量的内存中),注意区分内存单元的地址和内存单元中的内容!

接着:
用malloc()分配所要的内存区,并将首地址存放在形参内存中,即,形参内存中的内容由原来的NULL变为刚分配内存的首地址,但实参变量所在内存中的内容并没有改变,还是NULL!(因为形参实参变量所在的内存是相互独立的,上面提到了),这是问题的关键

最后:
GetMemory()返回,在GetMemory()中形参变量是动态分配,函数返回时,会被自动收回,形参p所在的内存被收回,刚刚存在这里用malloc分配的内存区首地址也随之消失,实参中的内容还是原样(NULL)

但是到这里程序还正常,没有崩溃,但留下的隐患
在执行strcpy(str,"hello"); 时候,实际上执行的操作是:
把字符串常量"hello"拷贝到str指针指向的内存区
而str指向的内存区地址为NULL(=0),咣当,崩溃!
这个地址是不允许写的

另外,如果在void GetMemory(char *p,int num)
判断p是否为NULL反而弄巧成拙,并不能达到目的,因为对于这个例子传进来的一定是NULL

你可以在main()中把str打印出来看看