标题:C语言:关于指针内存分配方面的一个程序,有什么问题 啊,求高手解答!谢谢 ...
只看楼主
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:5 
以下是引用weishen2011在2012-11-23 11:30:57的发言:

 
 
呵呵,谢谢哥们提醒,话说哥们好像很严肃啊,不过还是想问下你,你说实参s的值传给了形参p,然后再运行getmemory函数,最终只给形参p分配了地址空间,而没给实参s分配地址空间,是这个意思吗?

既然回过一帖,你又再问,不妨给你解释一下:无论传的什么参数,都是值传递,函数中形参p的地址值是从实参s中复制过来的,这是两个不同的指针数据,你在函数中给p赋值,与s无关,除非你把p的值再赋给s。正确的做法是函数返回分配后的指针,即return p,在调用处,s=p或s=getmemory(100),无需使用更隐晦的二级指针,把简单问题复杂化——其实这个函数的如此用法是多余的,纯作示例无妨。这样分配内存的函数,切记在上级函数中释放内存!

关于指针和参数传递原理,我讲过不下两三次,翻翻论坛旧帖都有,明白那个传参的原理,就绝不会犯这种错误,光模仿别人的代码是没用的,问问题别人给你写出代码也是解决不了长久问题的。

授人以渔,不授人以鱼。
2012-11-23 13:03
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
得分:0 
以下是引用TonyDeng在2012-11-23 13:03:31的发言:


既然回过一帖,你又再问,不妨给你解释一下:无论传的什么参数,都是值传递,函数中形参p的地址值是从实参s中复制过来的,这是两个不同的指针数据,你在函数中给p赋值,与s无关,除非你把p的值再赋给s。正确的做法是函数返回分配后的指针,即return p,在调用处,s=p或s=getmemory(100),无需使用更隐晦的二级指针,把简单问题复杂化——其实这个函数的如此用法是多余的,纯作示例无妨。这样分配内存的函数,切记在上级函数中释放内存!

关于指针和参数传递原理,我讲过不下两三次,翻翻论坛旧帖都有,明白那个传参的原理,就绝不会犯这种错误,光模仿别人的代码是没用的,问问题别人给你写出代码也是解决不了长久问题的。


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *getmemory(char *p);
int main()
{
    char *s;
    getmemory(s);
    s=p;
    strcpy(s,"abcde");
    printf("%s",s);
    system("pause");
    return 0;
}
char *getmemory(char *p)
{
     p=(char *)malloc(100);
     return p;
}
还是有问题啊,郁闷了!下面用二级指针编译也报错了,崩溃了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *getmemory(char *p);
int main()
{
    char *s;
    getmemory(&s);
    strcpy(s,"abcde");
    printf("%s",s);
    system("pause");
    return 0;
}
void getmemory(char **p)
{
     p=(char *)malloc(100);
}
2012-11-23 18:48
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
得分:0 
以下是引用TonyDeng在2012-11-23 13:03:31的发言:


既然回过一帖,你又再问,不妨给你解释一下:无论传的什么参数,都是值传递,函数中形参p的地址值是从实参s中复制过来的,这是两个不同的指针数据,你在函数中给p赋值,与s无关,除非你把p的值再赋给s。正确的做法是函数返回分配后的指针,即return p,在调用处,s=p或s=getmemory(100),无需使用更隐晦的二级指针,把简单问题复杂化——其实这个函数的如此用法是多余的,纯作示例无妨。这样分配内存的函数,切记在上级函数中释放内存!

关于指针和参数传递原理,我讲过不下两三次,翻翻论坛旧帖都有,明白那个传参的原理,就绝不会犯这种错误,光模仿别人的代码是没用的,问问题别人给你写出代码也是解决不了长久问题的。


二级指针总算搞出来了:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void getmemory(char **p);
int main()
{
    char *s;
    getmemory(&s);
    strcpy(s,"abcde");
    printf("%s",s);
    system("pause");
    return 0;
}
void getmemory(char **p)
{
     *p=(char *)malloc(100);
}
不用二级指针真不会,还是没改出来!
2012-11-23 18:57



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




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

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