我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

« 1 2» Pages: ( 1/2 total )
本页主题: 看看哪里溢出了? 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

独飞の孤心



性别: 帅哥 状态: 该用户目前不在线
头衔: 孽缘!
等级: 荣誉会员
家族: 单身贵族
发贴: 4484
威望: 3
浮云: 496
在线等级:
注册时间: 2005-10-12
最后登陆: 2011-09-23

5come5帮你背单词 [ mimick // vt. 模仿 ]


看看哪里溢出了?

#include <stdio.h>
#include <malloc.h>
#define MAX 20

typedef struct
{
  int top;
  int e[MAX];
}Stack;

void Init(Stack *S);

void main()
{
  int elem;
  Stack *s;
  Init(s);
  printf("now the stack's size is:%d\n",s->top);
}  


void Init(Stack *S)
{
  S=(Stack *)malloc(sizeof(Stack));
  if(S==NULL)
  {
    printf("failed!\n");
  }
  S->top=1;  
  printf("***size***:%d\n",S->top);
}



输出结果是***size***:1
          now the stack's size is:18756

请问是哪里溢出了呢?
为什么在子函数都可以正确输出,而到了main就变了呢

谢谢


[ 此贴被独飞の孤心在2006-09-09 13:34重新编辑 ]
顶端 Posted: 2006-09-09 13:13 | [楼 主]
minpayne



性别: 帅哥 状态: 该用户目前不在线
头衔: ...pure love...
等级: 字幕组
家族: 燕窝
发贴: 1747
威望: 5
浮云: 205
在线等级:
注册时间: 2005-09-20
最后登陆: 2008-04-06

5come5帮你背单词 [ prosecute /'prosikju:t/ n. & v. 起诉,告发 ]


看下面
顶端 Posted: 2006-09-09 13:28 | [1 楼]
minpayne



性别: 帅哥 状态: 该用户目前不在线
头衔: ...pure love...
等级: 字幕组
家族: 燕窝
发贴: 1747
威望: 5
浮云: 205
在线等级:
注册时间: 2005-09-20
最后登陆: 2008-04-06

5come5帮你背单词 [ bunch /bΛnt/ n. 一串,一束 ]


void Init(Stack *S)
{
S=(Stack *)malloc(sizeof(Stack));
if(S=NULL)
{
  printf("failed!\n");
}
S->top=1;  
printf("***size***:%d\n",S->top);
}

这里IF语句中应该是==不是=
malloc应该在INT MAIN()里面,不该在函数体内,因为函数调用完时那块空间会被释放
顶端 Posted: 2006-09-09 13:31 | [2 楼]
独飞の孤心



性别: 帅哥 状态: 该用户目前不在线
头衔: 孽缘!
等级: 荣誉会员
家族: 单身贵族
发贴: 4484
威望: 3
浮云: 496
在线等级:
注册时间: 2005-10-12
最后登陆: 2011-09-23

5come5帮你背单词 [ prosperity /pros'periti/ n. 繁荣,兴旺 ]


改了过后也一样。。。
顶端 Posted: 2006-09-09 13:35 | [3 楼]
minpayne



性别: 帅哥 状态: 该用户目前不在线
头衔: ...pure love...
等级: 字幕组
家族: 燕窝
发贴: 1747
威望: 5
浮云: 205
在线等级:
注册时间: 2005-09-20
最后登陆: 2008-04-06

5come5帮你背单词 [ trap /træp/ n. 陷阱,诡计,圈套;vt. 设陷阱捕捉,使陷入困境 ]


我编辑了以下 有两个问题哈
顶端 Posted: 2006-09-09 13:36 | [4 楼]
minpayne



性别: 帅哥 状态: 该用户目前不在线
头衔: ...pure love...
等级: 字幕组
家族: 燕窝
发贴: 1747
威望: 5
浮云: 205
在线等级:
注册时间: 2005-09-20
最后登陆: 2008-04-06

5come5帮你背单词 [ operation /opə'reiən/ n. 操作,运转,作用,手术,运算 ]


我用GCC已经调通了
顶端 Posted: 2006-09-09 13:36 | [5 楼]
独飞の孤心



性别: 帅哥 状态: 该用户目前不在线
头衔: 孽缘!
等级: 荣誉会员
家族: 单身贵族
发贴: 4484
威望: 3
浮云: 496
在线等级:
注册时间: 2005-10-12
最后登陆: 2011-09-23

5come5帮你背单词 [ flight /flait/ n. 航班,飞行,航程 ]


Quote:
引用第5楼minpayne于2006-09-09 13:36发表的:
我用GCC已经调通了

输出的结果呢?

是1,1吗?

我的第二个数还是18765呢
顶端 Posted: 2006-09-09 13:39 | [6 楼]
minpayne



性别: 帅哥 状态: 该用户目前不在线
头衔: ...pure love...
等级: 字幕组
家族: 燕窝
发贴: 1747
威望: 5
浮云: 205
在线等级:
注册时间: 2005-09-20
最后登陆: 2008-04-06

5come5帮你背单词 [ comparative /kəm'pærətiv/ a. 比较的,比较而言的,相当的 ]


是1,1
顶端 Posted: 2006-09-09 13:44 | [7 楼]
独飞の孤心



性别: 帅哥 状态: 该用户目前不在线
头衔: 孽缘!
等级: 荣誉会员
家族: 单身贵族
发贴: 4484
威望: 3
浮云: 496
在线等级:
注册时间: 2005-10-12
最后登陆: 2011-09-23

5come5帮你背单词 [ room /ru:m, rum/ n. 房间,卧室,余地,空间 ]


Quote:
引用第7楼minpayne于2006-09-09 13:44发表的:
是1,1

难道是我的编译器的问题?
顶端 Posted: 2006-09-09 13:45 | [8 楼]
minpayne



性别: 帅哥 状态: 该用户目前不在线
头衔: ...pure love...
等级: 字幕组
家族: 燕窝
发贴: 1747
威望: 5
浮云: 205
在线等级:
注册时间: 2005-09-20
最后登陆: 2008-04-06

5come5帮你背单词 [ western /'westən/ a. 西方的,西部的 ]


#include <stdio.h>
#include <malloc.h>
#define MAX 20

typedef struct
{
int top;
int e[MAX];
}Stack;

void Init(Stack *S);

void main()
{
int elem;
Stack *s=(Stack *)malloc(sizeof(Stack));
Init(s);
printf("now the stack's size is:%d\n",s->top);
}  


void Init(Stack *S)
{
/*S=(Stack *)malloc(sizeof(Stack));*/
if(S==NULL)
{
  printf("failed!\n");
}
S->top=1;  
printf("***size***:%d\n",S->top);
}

你是不是改成这样?
顶端 Posted: 2006-09-09 13:48 | [9 楼]
agang10



性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 982
威望: 0
浮云: 1126
在线等级:
注册时间: 2006-02-18
最后登陆: 2012-02-10

5come5帮你背单词 [ undoubtedly /Λn'dautidli/ ad. 不容置疑地,肯定地 ]


如果不改的话是1,0
按照楼上的改了过后是1,1
是不是在自定义函数中分配的的内存空间在运行完后会自动释放掉造成的啊!
顶端 Posted: 2006-09-09 14:04 | [10 楼]
kangtalc



性别: 帅哥 状态: 该用户目前不在线
头衔: 揍敌客·奇犽
等级: 希望之光
家族: 万人坑恋影部落
发贴: 1723
威望: 5
浮云: 1113
在线等级:
注册时间: 2005-09-21
最后登陆: 2008-06-29

5come5帮你背单词 [ cancer /'kænsə/ n. 癌症,肿瘤 ]


这个错误是个典型的问题,当函数的参数是指针时,请不要试图通过指针申请到空间
因为你传入的是一个指针S,那么传入后会在函数内部局部作用域制作一个S的临时副本_S,所以当你申请动态内存时是给_S申请的,而不是S,也就是S根本就没有得到空间.S的值根本没有变
当函数执行完时由于_S没有被FREE,所以会造成内存泄露
有两种解决方法,一个是传回返回值,将函数写成
Copy code
Stack* Init(Stack *S)
{
S=(Stack *)malloc(sizeof(Stack));
if(S==NULL)
{
  printf("failed!\n");
}
S->top=1;  
printf("***size***:%d\n",S->top);
return S;
}

void main()
{
int elem;
Stack *s;
s = Init(s);
printf("now the stack's size is:%d\n",s->top);
free(s);
}  


或者是传入指向指针的指针
比如

Copy code
void Init(Stack **S)
{
*S=(Stack *)malloc(sizeof(Stack));
if(*S==NULL)
{
  printf("failed!\n");
}
*S->top=1;  
printf("***size***:%d\n",*S->top);
}

void main()
{
int elem;
Stack *s;
Init(&s);
printf("now the stack's size is:%d\n",s->top);
free(s);
}

还有要养成malloc和free的配对关系,有多少个malloc就应该有多少个free,要不然会造成内存泄露
顶端 Posted: 2006-09-09 16:37 | [11 楼]
a-bomb



性别: 帅哥 状态: 该用户目前不在线
头衔: ‖四∷大∷淫∷魔∷之∷首‖
等级: 人见人爱
发贴: 3076
威望: 2
浮云: 1747
在线等级:
注册时间: 2004-03-31
最后登陆: 2015-06-12

5come5帮你背单词 [ nineteen /'nain'ti:n/ num. 十九 ]


楼上的抢先了,我就不说了
顶端 Posted: 2006-09-09 16:41 | [12 楼]
独飞の孤心



性别: 帅哥 状态: 该用户目前不在线
头衔: 孽缘!
等级: 荣誉会员
家族: 单身贵族
发贴: 4484
威望: 3
浮云: 496
在线等级:
注册时间: 2005-10-12
最后登陆: 2011-09-23

5come5帮你背单词 [ automate /'o:təmeit/ vt. 使自动化 ]


热,以前看过这个问题

没想到今天自己遇到了。。。

看来还是要实践才行啊。。。
顶端 Posted: 2006-09-09 16:51 | [13 楼]
debuger





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 410
威望: 0
浮云: 1227
在线等级:
注册时间: 2004-12-25
最后登陆: 2007-04-10

5come5帮你背单词 [ crowd /kraud/ n. 群,人群,群众;vt. 挤满,塞满;vi. 聚集,群集 ]


Quote:
引用第11楼kangtalc于2006-09-09 16:37发表的:
这个错误是个典型的问题,当函数的参数是指针时,请不要试图通过指针申请到空间
因为你传入的是一个指针S,那么传入后会在函数内部局部作用域制作一个S的临时副本_S,所以当你申请动态内存时是给_S申请的,而不是S,也就是S根本就没有得到空间.S的值根本没有变
当函数执行完时由于_S没有被FREE,所以会造成内存泄露
有两种解决方法,一个是传回返回值,将函数写成
[code]
.......

第一种方法依然不是很好,从结构上说,malloc在自己的函数里面,free也该自己封装,作成对应的

第二种方法不好在于不能链式,对本例来说不方便判断出错,这种通过参数获得返回值的做法一般用于"值-结果"的方式。

当然这个基本是鸡蛋挑骨头了,不过在正式的开发中却必须注意
顶端 Posted: 2006-09-09 17:33 | [14 楼]
« 1 2» Pages: ( 1/2 total )
我来我网·5come5 Forum » 程序员之家

Total 0.012402(s) query 7, Time now is:05-14 21:21, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号