| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 952 人关注过本帖
标题:C语言:关于指针内存分配方面的一个程序,有什么问题 啊,求高手解答!谢谢 ...
取消只看楼主 加入收藏
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
结帖率:80%
收藏
已结贴  问题点数:10 回复次数:5 
C语言:关于指针内存分配方面的一个程序,有什么问题 啊,求高手解答!谢谢了!!
#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);
}
为什么程序编译没错,但是运行时说“改程序引用的内存0x000000002不能为written”???
而如果去掉下面的getmemory函数,直接将s=(char *)malloc(100);这条语句加到char *s;后面,程序则运行正常!!什么情况啊,为什么会这样??求高手解答啊!谢谢大家了!
搜索更多相关主题的帖子: include written system 
2012-11-23 00:51
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
收藏
得分:0 
以下是引用zhu224039在2012-11-23 06:54:33的发言:

上面的家伙跟你急了
他也跟我急过
建议去看函数的形参和实参部分的知识

再从程序运行方面给你解释下

 c对函数进行调用的时候 是将传送给函数的值进行了入栈操作的
打个很简单的比方
function(1,2,3)
这个函数调用
在调用这个函数之前 入栈保存这3个参数的值,操作过程为
pushl 3
pushl 2
pushl 1
call function
这么一个过程的
在函数内部对这个传送过来的值的处理就是在栈中进行的啦
具体是怎么引用这个 3 2 1的  

恩,谢谢!但是为什么程序编译没错,但是运行时说“改程序引用的内存0x000000002不能为written”???后面内存不能写入是什么意思 啊?
2012-11-23 11:26
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
收藏
得分:0 
以下是引用pauljames在2012-11-23 06:46:25的发言:

void getmemory(char **p);

    char *s;
    getmemory(&s);


有点这个意思
2012-11-23 11:27
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
收藏
得分:0 
以下是引用TonyDeng在2012-11-23 03:29:16的发言:

你以为形参char* p,就能改变实参s的值?注册时间也不短了,人家讲解指针的参数传递原理时你不看不学,反反覆覆地问同类问题。

另外,很反感这种“高手请进”的帖子,我通常是不进的,偶尔看到,回一下,顺便表达上面的观点,纯粹搭车,下面一大堆同类的帖子,不看。


呵呵,谢谢哥们提醒,话说哥们好像很严肃啊,不过还是想问下你,你说实参s的值传给了形参p,然后再运行getmemory函数,最终只给形参p分配了地址空间,而没给实参s分配地址空间,是这个意思吗?
2012-11-23 11:30
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
快速回复:C语言:关于指针内存分配方面的一个程序,有什么问题 啊,求高手解答! ...
数据加载中...
 
   



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

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