免费注册 查看新帖 |

Chinaunix

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

[C] 程序运行输出时出现内存错误,我不行了!(指针问题我实在搞不懂) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-30 22:55 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>

typedef struct linknode{
    int data;
    struct linknode *next;
}listack;

void init_stack(listack *s)
{
    s=(listack *)malloc(sizeof(listack));
    s->next=NULL;
}

void output_stack(listack *s)
{
    listack *p=s->next;
    while(p!=NULL)
    {
        printf("%3d",p->data);
        p=p->next;
    }
    printf("\n");
}

void push(listack *s,int e)
{
    listack *p;
    p=(listack *)malloc(sizeof(listack));
    p->data=e;
    p->next=s->next;
    s->next=p;
}

void main()
{
    int i;
    listack s;
    init_stack(&s);
    printf("请输入进栈元素:");
    scanf("%d",&i);
    push(&s,i);
    printf("栈内元素为:");
    output_stack(&s);        
}

论坛徽章:
0
2 [报告]
发表于 2009-05-30 22:57 |只看该作者
请各位大到底虾帮我改改,给我讲讲那个一级与二级指针该何时在何地用?

论坛徽章:
0
3 [报告]
发表于 2009-05-31 00:08 |只看该作者
各位都帮你改的话,这程序一定不成样子。
答案仅供参考:传给 init_stack() 的应是一个一级指针的地址,而 main() 当中定义的 s 应该是指向 listack 类型的指针。

1、C 语言里只有按值传递的参数,函数体内得到的只是原变量的一份拷贝,对这份拷贝所做的一切改动无法应用到原变量上面。
2、指针需要指向一个具体的对象才能使用,用 malloc() 得到的堆内存可以是指针指向的目标。

综合考虑这两句话,你就知道该如何去改了。

论坛徽章:
0
4 [报告]
发表于 2009-05-31 01:19 |只看该作者
这个程序错的地方不是一个二个, 作者估计头晕了,逻辑不清晰,哈哈

论坛徽章:
0
5 [报告]
发表于 2009-05-31 01:31 |只看该作者
帮你改了一下, 你自己看。


  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct linknode{
  4.     int data;
  5.     struct linknode *next;
  6. }listack;

  7. void init_stack(listack *s)
  8. {
  9.     s=(listack *)malloc(sizeof(listack));
  10.     s->next=NULL;
  11. }

  12. void output_stack(listack *s)
  13. {
  14.    // listack *p=s->next;
  15.     while(s != NULL)
  16.     {
  17.         printf("%3d",s->data);
  18.         s = NULL;
  19.     }
  20.     printf("\n");
  21. }

  22. void push(listack *s,int e)
  23. {
  24.     //listack *p;
  25.    // p=(listack *)malloc(sizeof(listack));
  26.     s->data=e;
  27.     //p->next=s->next;
  28.     //s->next=p;
  29. }

  30. void main()
  31. {
  32.     int i;
  33.     listack s;
  34.     init_stack(&s);
  35.     printf("stack in:");
  36.     scanf("%d",&i);
  37.     push(&s,i);
  38.     printf("stack number is:");
  39.     output_stack(&s);        
  40. }

复制代码

论坛徽章:
0
6 [报告]
发表于 2009-05-31 10:47 |只看该作者
调用init_stack(&s)后, 在init_stack里s值是这个结构地址,但是它是个局部变量(虽然名一样),起先listack s运行时在栈上分配,是可以得到一个确切地址的。在函数内再malloc,只是获得另外一个地址值,而且s=(listack *)malloc(sizeof(listack));不会反应到main里的s上去,即便
s->next=NULL; ==》 (*s).next = NULL;也一样,它是改变新分配的地址上那个结构的next成员。

所以传指针的指针才可以。

楼上那个做法有点投机呵呵,

论坛徽章:
0
7 [报告]
发表于 2009-05-31 10:55 |只看该作者
堆栈上分配的东西,不return的话.都要传指针的指针滴

论坛徽章:
0
8 [报告]
发表于 2009-05-31 11:09 |只看该作者
void init_stack(listack *s)
{
    s=(listack *)malloc(sizeof(listack));
    s->next=NULL;
}

主要是初始化s的问题,你这里的s和main中的s就没什么关系了
可以用二级指针改下
例如:
void main()
{
........
     listack *s;
     init_stack(&s);
}
void init_stack(listack **s)
{
    *s =(listack *)malloc(sizeof(listack));
    s->next  =NULL;
}

基本就是这个思路改

论坛徽章:
0
9 [报告]
发表于 2009-05-31 11:48 |只看该作者
原帖由 吃烤鱼 于 2009-5-31 11:09 发表
void init_stack(listack *s)
{
    s=(listack *)malloc(sizeof(listack));
    s->next=NULL;
}

主要是初始化s的问题,你这里的s和main中的s就没什么关系了
可以用二级指针改下
例如:
void main() ...

应该是(*s)->next=NULL;

论坛徽章:
0
10 [报告]
发表于 2009-05-31 17:11 |只看该作者
楼上的改得对,一时疏忽
罪过
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP