鱼C论坛

 找回密码
 立即注册
查看: 1636|回复: 17

求助一段程序的分析

[复制链接]
发表于 2015-4-28 21:32:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
那位大神可以帮忙分析一下下面这段程序,是怎样一个过程,有点乱,理不清楚。。。拜托拜托

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函数会有什么样的结果?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-28 21:50:12 | 显示全部楼层
输出hello
主要可能是对那个GetMemory(char **p, int num)函数的第一个参数会出现不懂的地方。
char **p代表指针的指针,可以理解为 *(*p),*p此时就是一个变量R(一个指针变量),那么*R代表R的地址(这个指针变量的地址),调用的时候传入str的地址&str,在函数中把str指向的地址(即str内存储的值)*str重新赋值为一个新开辟的空间,那么回到主函数里,str就指向了这个新空间,然后对新空间进行操作放入字符串。printf函数直接打印字符串指针会打印出字符串这个知道吧~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-28 23:26:51 | 显示全部楼层
2楼说的对
test函数里面定义了char型指针变量str,并为其分配4个字节内存,被调函数通过p指向该内存,*p即为该char指针str,在GetMemory中动态分配num字节的内存,让str指向该内存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2015-4-29 00:13:01 From FishC Mobile | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2015-4-29 01:22:52 From FishC Mobile | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-29 01:35:33 From FishC Mobile | 显示全部楼层
本帖最后由 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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-29 12:27:43 | 显示全部楼层
shorey 发表于 2015-4-28 21:50
输出hello
主要可能是对那个GetMemory(char **p, int num)函数的第一个参数会出现不懂的地方。
char **p ...

灰常感谢,我再缕缕:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-29 12:28:16 | 显示全部楼层
myqicq 发表于 2015-4-29 01:35
不知道有没有理解错!!!
void GetMemory(char **p, int num){
        *p = (char *)malloc(num);

Thanks very much!!:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-29 12:28:49 | 显示全部楼层
likeangel 发表于 2015-4-29 00:13
找师父,我现在什么都不会

同样感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-29 12:29:49 | 显示全部楼层
likeangel 发表于 2015-4-29 01:22
真是难得给力的帖子啊.

thanks....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-29 12:39:15 | 显示全部楼层
shorey 发表于 2015-4-28 21:50
输出hello
主要可能是对那个GetMemory(char **p, int num)函数的第一个参数会出现不懂的地方。
char **p ...

是不是这样理解:p是一个指针,存放的是另一个指针的地址(另一个指针的存储位置),*p是另一个指针的值,而这个值是一个字符变量的存储位置。

还有个疑问,&str是赋值给p还是*p,因为p和*p都是一个地址?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-29 14:35:40 From FishC Mobile | 显示全部楼层
鱼C论坛就是好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-29 15:45:22 | 显示全部楼层
本帖最后由 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");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-29 15:55:44 | 显示全部楼层
本帖最后由 myqicq 于 2015-4-29 18:15 编辑
shorey 发表于 2015-4-28 21:50
输出hello
主要可能是对那个GetMemory(char **p, int num)函数的第一个参数会出现不懂的地方。
char **p ...

GetMemory(&str, 100);  应该是100个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-29 16:17:27 | 显示全部楼层
myqicq 发表于 2015-4-29 15:45
@追忆lh
这是我的理解方式,希望对你有用,中国式英文,见笑了....

在getmemory函数为str申请一块4字节的内存空间
str 的4个字节内存空间是在getmemory分配的么?
@myqicq
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-29 16:24:27 | 显示全部楼层
本帖最后由 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)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-29 16:52:10 | 显示全部楼层
追忆lh 发表于 2015-4-29 12:39
是不是这样理解:p是一个指针,存放的是另一个指针的地址(另一个指针的存储位置),*p是另一个指针的值 ...

对的,是这样的。
&str是赋值给p的,*p代表str内存的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-29 19:41:05 | 显示全部楼层
myqicq 发表于 2015-4-29 15:45
@追忆lh @小甲鱼
这是我的理解方式,希望对你有用,中国式英文,见笑了....

太感谢了,这个方法很直观,thanks  a lot
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 21:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表