免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 3834 | 回复: 21
打印 上一主题 下一主题

[C] 【请教】百思不得其解,关于C语言指针的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-30 20:52 |只看该作者 |倒序浏览
《高质量C++编程》中的一个例子,程序代码如下:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void GetMemory(char* p)
{
    p = (char *)malloc(100);
}

void main(void)
{
    char* str = NULL;
    GetMemory (str);
    strcpy(str, "hello world\n");
    printf(str);
}

请问运行Test 函数会有什么样的结果?
答:程序崩溃。
因为GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NULL。
strcpy(str, "hello world");将使程序崩溃。

但是我还是没有想明白,既然在main中GetMemory函数入口参数是一个指针,那么str指针作为参数应该是被作为“指针传递”而不是“值传递”

那么在GetMemory函数中str指针应该能够得到初始化,但为什么在GetMemory函数退出后,str指针的值却还原为NULL了

百思不得其解,望各位拍转拍醒我吧,谢谢!

论坛徽章:
0
2 [报告]
发表于 2005-11-30 21:01 |只看该作者
应该改为:

  1. void GetMemory(char** p)
  2. {
  3.     *p = (char *)malloc(100);
  4. }

  5. int main(void)
  6. {
  7.     char* str = NULL;
  8.     GetMemory (&str);
  9.     strcpy(str, "hello world\n");
  10.     printf(str);

  11.         return 0;
  12. }
复制代码


指针也是值,本质上任何函数传递都是值传递,只不过传递指针的值的时候指针的值是"地址",你去好好体会一下吧

论坛徽章:
0
3 [报告]
发表于 2005-11-30 22:11 |只看该作者
传指针可以改变指针所指向的那块内存的内容。而为指针分配内存,是让指针指向一块合法的内存,改变指

针本身所含的内容(地址)。达到这个目的,传递的只要是指针的指针才可以。

论坛徽章:
0
4 [报告]
发表于 2005-11-30 23:33 |只看该作者
我是这样理解的
你传了个指针进来,其实是传递了一份拷贝
这份地址拷贝通过new以后已经指向是一个新的值了
函数跑完后,变的是这这个指针的拷贝,而不是传进来的指针
加个引用其实就很好理解了

论坛徽章:
0
5 [报告]
发表于 2005-12-01 07:20 |只看该作者
其实改成
char* GetMemory()
{
  char *p = (char *)malloc(100);
  return p;
}

char *str = GetMemory();
就可以了。
扬子江 该用户已被删除
6 [报告]
发表于 2005-12-01 07:51 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2005-12-01 08:45 |只看该作者
原帖由 doomslayer 于 2005-11-30 23:33 发表
我是这样理解的
你传了个指针进来,其实是传递了一份拷贝
这份地址拷贝通过new以后已经指向是一个新的值了
函数跑完后,变的是这这个指针的拷贝,而不是传进来的指针
加个引用其实就很好理解了

同意,我也这么理解。感觉书上说的不准确。

论坛徽章:
0
8 [报告]
发表于 2005-12-01 08:49 |只看该作者
就是传递的值,指针也是值,到里面你做的改变,肯定没办法反映出来

论坛徽章:
0
9 [报告]
发表于 2005-12-01 09:12 |只看该作者
所有的实参进入函数内部时,都会创建一临时副本,以此形式来应用的,因此,导致了exchange(int a,int b)和getMem(char *p)之类的问题

论坛徽章:
0
10 [报告]
发表于 2005-12-01 09:28 |只看该作者
原帖由 huntermq 于 2005-12-1 09:12 发表
所有的实参进入函数内部时,都会创建一临时副本,以此形式来应用的,因此,导致了exchange(int a,int b)和getMem(char *p)之类的问题



同意创建临时副本一说
LZ要分清楚局部和整体变量 如果按楼主意思
使Get*函数返回字符指针P即可

如果函数返回值为vid
改变一个值.楼主应该知道通过一个指向这个值的指针 改变其地址即可 (下面是小学造句)
改变一个指针,楼主应该知道通过一个指向这个指针的指针 改变其地址即可 (造句成功! 耶~~~~)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP