首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一直困扰自己也一定困扰很多的有关问题

2012-03-17 
一直困扰自己也一定困扰很多的问题voidGetMemory(char*str){str(char*)malloc(100)}main(void){char*str

一直困扰自己也一定困扰很多的问题
void   GetMemory(   char   *     str)
{
str   =   (char*)malloc(100);
}


main(void)
{
char   *str   =   NULL;
GetMemory(str);
strcpy(str, "Hello ");
cout < <str < <endl;
system( "pause ");

}
这个程序运行期会错误,我就是找不到很好的理由来解答,大家能否给个原因阿
void   GetMemory(   char   **     str)
{
*str   =   (char*)malloc(100);
}
这样却可以

[解决办法]
你是要修改指针的指向,而不是修改指针指向的值,所以要char **,或者char *&
[解决办法]
void GetMemory( char * str)
{
str = (char*)malloc(100);
}


main(void)
{
char *c = NULL;
GetMemory(c); //这样写值传递没区别 str=c ; str = (char*)malloc(100);c改变了没?
strcpy(c, "Hello ");
cout < <c < <endl;
system( "pause ");

}
2级指针就可以修改传进来指针的值



[解决办法]
三种修改方法:


1.void GetMemory( char * &str) //这里改为对指针的引用
{
str = (char*)malloc(100);
}


2.char* GetMemory( char * str) //改为返回一个char*
{
str = (char*)malloc(100);
return str;
}


3.如楼主自己说的那样,我就不写了


之所以这样是因为你在调用GetMemory的时候,主函数这边的str传到GetMemory函数里面,而如果形参也是char*类型的话,在函数里对str的申请的空间是送不到这个main函数里的str上的(因为是按值传递的),所以在主函数下面调用strcpy的时候,主函数这的str并没有空间,所以要出错.

而现在将函数GetMemory里的形参改成char *&或char **类型之后,在函数里对str的申请就相当于作用到了主函数这边的str上,再往下调用strcpy的时候,str也是有空间的,就不再出错误了

[解决办法]
free(str);
这句就我个人理解

str指向的内存可以再度被分配

str实际还是指向那块动态存储区

所以也就存在隐患 如果别的程序使用那块内存 那里面东西你知道是什么吗?

所以很多人都这样写
free(str);
str=NULL;

不知道我说的对不对
[解决办法]

void GetMemory( char * str)
{
str = (char*)malloc(100);
}
main(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "Hello ");
cout < <str < <endl;
system( "pause ");

}
可能我没有写清楚,指针是指向一块内存地址的,就你的程序来说,一开始char *str = NULL;把指针指向的内存地址赋值为NULL,也就是0.
然后你调用GetMemory(str),是想把指针str指向的内存地址修改为GetMemory函数中malloc的内存地址,比如0x12345678,但是你只传入指针的话,就只能够修改指针所指向内存地址的值,也就是一开始赋的NULL,也就是0x00000000里面的值,而0地址是被操作系统保护起来的,当修改的时候,会报错,而且与该程序的目的不同。
该程序如果要修改指针指向的内存地址,就必须传入指针的指针(即二级指针),或者传入指针的引用(char* &),这样写,不知是否清楚些了。
[解决办法]
ItsMyLife(很好,很强大)说得对,
GetMemory(c); //这样写值传递没区别 str=c ; str = (char*)malloc(100);c改变了没?

你还可以利用引用的方式
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

using namespace std;

void GetMemory( char * &str)
{
str = (char*)malloc(100);
}


int main(void)
{
char *str = NULL;
GetMemory(str);
if(str!=NULL)
{
strcpy(str, "Hello ");
cout < <str < <endl;
}
else
cout < < "error " < <endl;
free(str);
system( "pause ");
return 0;
}

这样main()中的str才可一指向一段划分的存储区
或是
char * GetMemory()
{
str = (char*)malloc(100);
return str;


}
int main(void)
{
char *str = NULL;
str=GetMemory();
if(str!=NULL)
{
strcpy(str, "Hello ");
cout < <str < <endl;
}
else
cout < < "error " < <endl;
free(str);
system( "pause ");
return 0;
}
[解决办法]
之所以要在使用指针前为其分配存储空间是为了防止在运行程序时修改内存中一些不容被修改的内容,即使没为其分配空间,也是可以让其所指的空间及往后连续一段存储信息的,只是这样做容易发生严重的错误。
char *str; //str所指未知,修改未知空间的内容,容易发生严重的错误
str= "hello ";

char *str = new char[1];
GetMemory(str);
strcpy(str, "Hello ");
同理,没有分配足够的空间,虽然能运行,但修改未知空间的内容,容易发生严重的错误。
你没遇上罢了。
[解决办法]
函数参数传的是值。
只有传指针或引用才行。
对函数参数方面要多研究一下。
[解决办法]
双指针
或者引用

指针这个概念误会了很多人。
[解决办法]
c语言里面函数调用是传值,
你要修改指针滴值,指针也是变量啊,要改变它,就得用另外一个指针指向这个指针

热点排行