标题:C语言:关于指针内存分配方面的一个程序,有什么问题 啊,求高手解答!谢谢 ...
只看楼主
weishen2011
Rank: 2
等 级:论坛游民
帖 子:92
专家分:70
注 册:2012-10-16
结帖率:80%
已结贴  问题点数:10 回复次数:12 
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
低调的哥额
Rank: 2
来 自:四川广安
等 级:论坛游民
帖 子:49
专家分:30
注 册:2012-6-6
得分:0 
神马情况

目标→黑客←努力 qq群281123877,讨论 奋斗!
2012-11-23 01:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你以为形参char* p,就能改变实参s的值?注册时间也不短了,人家讲解指针的参数传递原理时你不看不学,反反覆覆地问同类问题。

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

[ 本帖最后由 TonyDeng 于 2012-11-23 03:31 编辑 ]

授人以渔,不授人以鱼。
2012-11-23 03:29
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
得分:0 
void getmemory(char **p);

    char *s;
    getmemory(&s);

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2012-11-23 06:46
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
得分:3 
上面的家伙跟你急了
他也跟我急过
建议去看函数的形参和实参部分的知识

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

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


[ 本帖最后由 zhu224039 于 2012-11-23 06:55 编辑 ]

我要成为嘿嘿的黑客,替天行道
2012-11-23 06:54
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
得分:0 
回复 4楼 pauljames
高手

我要成为嘿嘿的黑客,替天行道
2012-11-23 07:04
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
木头人不是人
Rank: 2
等 级:论坛游民
帖 子:8
专家分:19
注 册:2012-11-4
得分:2 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void getmemory(char *p);
int main()
{
    char *s;
    getmemory(s);//问题出现在这里, 这里传递的是 s的内容,s是指针,但是,你定义到这里,它没有指向所以,它的内容是不可知的
    strcpy(s,"abcde");//
    printf("%s",s);
    system("pause");
    return 0;
}
void getmemory(char *p)//这里接收就是不可之的地址,
{
     p=(char *)malloc(100); }//这里指向的是新新建的地址,但是这个和 上面的s所指向的地址是不一样的,
//改的话,函数返回 地址,就可以了
char *getmemory (void)//参数你可以接收需要创建的 大小
{
    char *p;
    p=(char *)malloc(100);
    return p;
}

要是有说错了的地方,请指教 互相学习 呵呵
2012-11-23 11:45



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




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

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