标题:双指针的问题
只看楼主
georgefz
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-6-14
结帖率:66.67%
已结贴  问题点数:20 回复次数:9 
双指针的问题
void GetMemory( char **p, int num )
{
 *p = (char *) malloc( num );
}
void Test( void )
{
 char *str = NULL;
 GetMemory( &str, 100 );
 strcpy( str, "hello" );
 printf( str );
}




请问为啥是&str,这是代表*p=&str吗?如果换成str行不行?
搜索更多相关主题的帖子: hello 
2016-07-19 14:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:7 
如果
void GetMemory( char* p, int num )
{
    p = malloc( num );
}
void Test( void )
{
    char* str = NULL;
    GetMemory( str, 100 );
    strcpy( str, "hello" );
    printf( str );
}
就相当于
char* str = NULL;

char* p = str;
int num = 100;
p = malloc( num );

strcpy( str, "hello" );
printf( str );
2016-07-19 14:28
georgefz
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-6-14
得分:0 
回复 2楼 rjsp
那&str呢?源程序怎么解释?
2016-07-19 14:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 3楼 georgefz
void GetMemory( char** p, int num )
{
    *p = malloc( num );
}
void Test( void )
{
    char* str;
    GetMemory( &str, 100 );
    strcpy( str, "hello" );
    printf( str );
}

相当于

char *str;

char** p = &str;
*p = malloc( num );

strcpy( str, "hello" );
printf( str );
2016-07-19 15:06
georgefz
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-6-14
得分:0 
回复 4楼 rjsp
*p = malloc( num );这句话意思是给*P分配一段内存吗?那是怎么给str分配内存的呢?
2016-07-19 16:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
分配一段内存,将此内存的首地址赋值给*p
*p就是str呀
2016-07-19 22:47
georgefz
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-6-14
得分:0 
回复 6楼 rjsp
*p不是指向str的地址吗?怎么又是str了
2016-07-21 10:33
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用georgefz在2016-7-21 10:33:05的发言:

*p不是指向str的地址吗?怎么又是str了
你哪里看到*p指向str的地址了?

char** p = &str;
是p指向str的地址
2016-07-21 11:05
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:7 
以下是引用georgefz在2016-7-19 14:11:39的发言:

void GetMemory( char **p, int num )
{
 *p = (char *) malloc( num );
}
void Test( void )
{
 char *str = NULL;
 GetMemory( &str, 100 );
 strcpy( str, "hello" );
 printf( str );
}




请问为啥是&str,这是代表*p=&str吗?如果换成str行不行?

存放地址的地方也有其地址。
这样写法是要将 p 作为I/O参数,初见不容易明白。
这样写可能较易理解:

char* GetMemory(int num)
{
    char *p = (char *) malloc( num );
    return p;
}
void Test( void )
{
 char *str = NULL;
 str = GetMemory( 100 );
 strcpy( str, "hello" );
 printf( str );
 free(str);
}
2016-07-21 15:44
zx315
Rank: 5Rank: 5
来 自:广东
等 级:职业侠客
威 望:2
帖 子:86
专家分:378
注 册:2016-7-13
得分:7 
直接用 str 是不行的,原因在于 C 调用函数时是按值传递参数。假如把程序改成这样:

程序代码:
void get_memory(char *p, int n) {
    p = (char *)malloc(n);
}

int main(void) {
    char *str;
    get_memory(str, 10);
    strcpy(str, "hello");
    printf("%s\n", str);
    return 0;
}


调用 get_memory 时,仅仅只是给变量 p 分配了内存,而变量 str 依旧没有指向任何分配的空间,就因为 C 是传值调用的……

对于原先的程序,其内存分配示意图如下:



即是说,调用 GetMemory 后,str 的值也是没有改变的,变的只是它所指向的地址……

至于第一个程序能运行,只是个意外,可以把 str 跟 p 的地址打印出来看看

Read The Fucking Source Code~
2016-07-23 12:12



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-467050-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028159 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved