阅读:2216回复:11
一个关于内存的问题
Test 函数的语句GetMemory(str, 200)并没有使str 获得期望的内存,str 依旧是NULL,为
什么? void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(str, 100); // str 仍然为 NULL strcpy(str, "hello"); // 运行错误 } |
|
沙发#
发布于:2005-07-31 10:17
你需要判断malloc时能不能正确分配.
而且你的作法是错的.正确的应该这样写 void GetMemory(char **p, int num) { *p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(&str, 100); // str 仍然为 NULL strcpy(str, "hello"); // 运行错误 } |
|
|
板凳#
发布于:2005-07-31 10:33
谢谢znsoft的回答,不过我更想知道为什么p = (char *)malloc(sizeof(char) * num);
没能分配到内存,也就是说到底c++内部是如何分配内存的阿 |
|
地板#
发布于:2005-07-31 21:33
你怎么知道没分配到内存?znsoft不是说了么,你的代码是错的。没能分配到内存的情况太罕见了。
|
|
|
地下室#
发布于:2005-08-01 00:11
malloc不出内存也正常,不过比较少见.当你的物理或虚存不够时,就会出错,最好判断一下指针是不是空的.或者用seh处理一下. 这样不处理95%时候不会出错,但一出错就是当机或非法操作之类的.hehe
|
|
|
5楼#
发布于:2005-08-01 00:14
比较好点的代码
bool GetMemory(char **p, int num){ *p = (char *)malloc(sizeof(char) * num); if(*p) return true; else return false; } void Test(void) { char *str = NULL; if(GetMemory(&str, 100)) { strcpy(str, "hello"); free(str); } } |
|
|
6楼#
发布于:2005-08-01 20:20
谢谢znsoft的热心回答,我这样理解不知道对不对:
p就相当于是一个数组名,p = (char *)malloc(sizeof(char) * num);显然就不对了, 而*p = (char *)malloc(sizeof(char) * num); 就相当于char *p=new char [num] 这样的话虽然有点差强人意不过好像更容易理解。 |
|
7楼#
发布于:2005-08-01 21:33
没必要理解成数组什么的. 当然,数组和指针是等价的.
一维数组名相当于一级指针. 二维数组名相当于二级指针 你的想法是对指针本身赋值,只能按我给出的方法,否则原始的指针就没有值.即使你传指针进去,指针本身也是一个变量,函数的参数相当于局部变量,你的原来的代码只是对局域变量赋值. 最简单的办法就是用指针的引用,这样好理解一点.不过,引用只能在c++中使用. |
|
|
8楼#
发布于:2005-08-01 21:35
c++版本
没有错误处理或seh处理,在c++中最好把malloc改成new/delete. 以下代码只能在c++ 编译器中通过.void GetMemory(char * & p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(str, 100); // str 仍然为 NULL strcpy(str, "hello"); // 运行错误 } |
|
|
9楼#
发布于:2005-08-02 11:05
嗯,知道了,我发现自己又懂了很多。
谢谢 |
|
10楼#
发布于:2005-08-03 16:29
你不是没有得到内存,是得到了内存以后没有返回给你接受内存地址的指针里
|
|
11楼#
发布于:2005-08-03 20:18
10楼的说的不错,我想是系统给p的副本_p分配了内存,只是p没得到内存,这时会内存泄露。
|
|