求助一段程序的分析
那位大神可以帮忙分析一下下面这段程序,是怎样一个过程,有点乱,理不清楚。。。拜托拜托Void GetMemory(char **p, int num){
*p = (char *)malloc(num);
}
void Test(void){
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, “hello”);
printf(str);
}
请问运行Test函数会有什么样的结果?
输出hello
主要可能是对那个GetMemory(char **p, int num)函数的第一个参数会出现不懂的地方。
char **p代表指针的指针,可以理解为 *(*p),*p此时就是一个变量R(一个指针变量),那么*R代表R的地址(这个指针变量的地址),调用的时候传入str的地址&str,在函数中把str指向的地址(即str内存储的值)*str重新赋值为一个新开辟的空间,那么回到主函数里,str就指向了这个新空间,然后对新空间进行操作放入字符串。printf函数直接打印字符串指针会打印出字符串这个知道吧~ 2楼说的对
test函数里面定义了char型指针变量str,并为其分配4个字节内存,被调函数通过p指向该内存,*p即为该char指针str,在GetMemory中动态分配num字节的内存,让str指向该内存 本帖最后由 myqicq 于 2015-4-29 09:01 编辑
不知道有没有理解错!!!
void GetMemory(char **p, int num){
*p = (char *)malloc(num);
}
void Test(void){
char *str = NULL; //申明一个空指针变量str
GetMemory(&str, 100); //传str的地址给getmemory函数,在getmemory函数为str申请一块4字节的内存空间
strcpy(str, "hello"); //把字符串"hello"复制到str所指向的空间
printf("%s\n", str); //打印str所指向的空间里的内容
}
@追忆lh
shorey 发表于 2015-4-28 21:50
输出hello
主要可能是对那个GetMemory(char **p, int num)函数的第一个参数会出现不懂的地方。
char **p ...
灰常感谢,我再缕缕:lol: myqicq 发表于 2015-4-29 01:35
不知道有没有理解错!!!
void GetMemory(char **p, int num){
*p = (char *)malloc(num);
Thanks very much!!:handshake likeangel 发表于 2015-4-29 00:13
找师父,我现在什么都不会
同样感谢! likeangel 发表于 2015-4-29 01:22
真是难得给力的帖子啊.
thanks.... shorey 发表于 2015-4-28 21:50
输出hello
主要可能是对那个GetMemory(char **p, int num)函数的第一个参数会出现不懂的地方。
char **p ...
是不是这样理解:p是一个指针,存放的是另一个指针的地址(另一个指针的存储位置),*p是另一个指针的值,而这个值是一个字符变量的存储位置。
还有个疑问,&str是赋值给p还是*p,因为p和*p都是一个地址? 鱼C论坛就是好 本帖最后由 myqicq 于 2015-4-29 18:25 编辑
追忆lh 发表于 2015-4-29 12:39
是不是这样理解:p是一个指针,存放的是另一个指针的地址(另一个指针的存储位置),*p是另一个指针的值 ...
@追忆lh @小甲鱼
这是我的理解方式,希望对你有用,中国式英文,见笑了....
#include <stdio.h>
#include <string.h>
void GetMemory(char **p, int num){
printf("the GetMemory p address=%X\n", p); //理解 **p 是一个什么东西,有什么作用
printf("the malloc to run befor *p the value is=%s\n", *p); //理解 *p 又是一个什么东西,其作用是什么
*p = (char *)malloc(num); //申请num所指定大小的内存空间
printf("the malloc to run after *p the value is=%s\n", *p); //为什么显示乱码,自己想一下,甲鱼哥常说的
}
void Test(void){
char *str = NULL; //申明一个空指针变量str
printf("the call GetMemory befor str the value is=%s\n", str);
printf("the Test str address=%X\n", &str);
GetMemory(&str, 100); //传str的地址给getmemory函数,在getmemory函数为str申请一块指定长度的内存空间
printf("the call GetMemory after str the value is=%s\n", str); //为什么显示乱码,自己想一下,甲鱼哥常说的
strcpy(str, "hello"); //把字符串"hello"复制到str所指向的空间
printf("the strcpy to run after str the value is=%s\n", str);
printf("%s\n", str); //打印str所指向的空间里的内容
}
void main(void)
{
Test();
system("pause");
} 本帖最后由 myqicq 于 2015-4-29 18:15 编辑
shorey 发表于 2015-4-28 21:50
输出hello
主要可能是对那个GetMemory(char **p, int num)函数的第一个参数会出现不懂的地方。
char **p ...
GetMemory(&str, 100);应该是100个字节 myqicq 发表于 2015-4-29 15:45
@追忆lh
这是我的理解方式,希望对你有用,中国式英文,见笑了....
在getmemory函数为str申请一块4字节的内存空间
str 的4个字节内存空间是在getmemory分配的么?
@myqicq 本帖最后由 myqicq 于 2015-4-29 16:29 编辑
Victory_6226 发表于 2015-4-29 16:17
在getmemory函数为str申请一块4字节的内存空间
str 的4个字节内存空间是在getmemory分配的么?
@myqicq
函数原型说明:
void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。 追忆lh 发表于 2015-4-29 12:39
是不是这样理解:p是一个指针,存放的是另一个指针的地址(另一个指针的存储位置),*p是另一个指针的值 ...
对的,是这样的。
&str是赋值给p的,*p代表str内存的内容 myqicq 发表于 2015-4-29 15:45
@追忆lh @小甲鱼
这是我的理解方式,希望对你有用,中国式英文,见笑了....
太感谢了,这个方法很直观,thanksa lot
页:
[1]