追忆lh 发表于 2015-4-28 21:32:02

求助一段程序的分析

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

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函数会有什么样的结果?

shorey 发表于 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函数直接打印字符串指针会打印出字符串这个知道吧~

Victory_6226 发表于 2015-4-28 23:26:51

2楼说的对
test函数里面定义了char型指针变量str,并为其分配4个字节内存,被调函数通过p指向该内存,*p即为该char指针str,在GetMemory中动态分配num字节的内存,让str指向该内存

likeangel 发表于 2015-4-29 00:13:01

likeangel 发表于 2015-4-29 01:22:52

myqicq 发表于 2015-4-29 01:35:33

本帖最后由 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

追忆lh 发表于 2015-4-29 12:27:43

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

灰常感谢,我再缕缕:lol:

追忆lh 发表于 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

追忆lh 发表于 2015-4-29 12:28:49

likeangel 发表于 2015-4-29 00:13
找师父,我现在什么都不会

同样感谢!

追忆lh 发表于 2015-4-29 12:29:49

likeangel 发表于 2015-4-29 01:22
真是难得给力的帖子啊.

thanks....

追忆lh 发表于 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都是一个地址?

k2012 发表于 2015-4-29 14:35:40

鱼C论坛就是好

myqicq 发表于 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");
}

myqicq 发表于 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个字节

Victory_6226 发表于 2015-4-29 16:17:27

myqicq 发表于 2015-4-29 15:45
@追忆lh
这是我的理解方式,希望对你有用,中国式英文,见笑了....

在getmemory函数为str申请一块4字节的内存空间
str 的4个字节内存空间是在getmemory分配的么?
@myqicq

myqicq 发表于 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)。

shorey 发表于 2015-4-29 16:52:10

追忆lh 发表于 2015-4-29 12:39
是不是这样理解:p是一个指针,存放的是另一个指针的地址(另一个指针的存储位置),*p是另一个指针的值 ...

对的,是这样的。
&str是赋值给p的,*p代表str内存的内容

追忆lh 发表于 2015-4-29 19:41:05

myqicq 发表于 2015-4-29 15:45
@追忆lh @小甲鱼
这是我的理解方式,希望对你有用,中国式英文,见笑了....

太感谢了,这个方法很直观,thanksa lot
页: [1]
查看完整版本: 求助一段程序的分析