鱼C论坛

 找回密码
 立即注册
查看: 3813|回复: 8

[已解决]关于栈malloc开辟空间返回失败?

[复制链接]
发表于 2018-6-20 16:18:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 理想小青年 于 2018-6-20 16:20 编辑

关于栈有很多种方式来实现,那么我在定义了两个结构体一个座位栈节点指向,另一个作为节点来入栈出栈,大体原理图
问题
s->bottom底指向新节点的时总是报错也在图中,好像返回malloc失败?因为PSTACK s定义的问题的问题?0Xcccccccc好像也有地址
代码如下:
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>

  4. typedef int elementype;

  5. typedef struct Node                        //定义节点
  6. {
  7.         elementype data;
  8.         struct Node *next;
  9. }Node,*PNode;

  10. typedef struct stack                //定义栈节点
  11. {
  12.         PNode top;                                //栈顶
  13.         PNode bottom;                        //栈底
  14. }STACK,*PSTACK;


  15. void Create_stack(PSTACK s);
  16. void Push_stack( PSTACK s, int val );
  17. void Traverse_stack( PSTACK s );
  18. void Pop_stack(PSTACK s);
  19. void Clear_stack(PSTACK s);


  20. int main(void)
  21. {
  22.         PSTACK s;
  23.         Create_stack(s);       
  24.         Push_stack(s, 5);
  25.         Traverse_stack(s);
  26.         Pop_stack(s);
  27.         Clear_stack(s);
  28.         return 0;
  29. }

  30. void Create_stack(PSTACK s)
  31. {
  32.         s->bottom = (PNode)malloc(sizeof(Node));
  33. //        printf("Debug");
  34.         if ( NULL == s->bottom )
  35.         {
  36.                 printf("分配内存失败!\n");
  37.                 exit(-1);
  38.         }
  39.         s->top = s->bottom;
  40.         s->top->data = 0;
  41.         s->top->next = NULL;                //防止出现野指针
  42.         printf("初始化栈成功!\n");
  43. }

  44. void Push_stack( PSTACK s, int val )
  45. {
  46.         PNode p = (PNode)malloc(sizeof(Node));
  47.         if( NULL == p )
  48.         {
  49.                 printf("Memory allocation failure");
  50.                 exit(EXIT_FAILURE);
  51.         }
  52.        
  53.         p->data = val;
  54.         p->next = s->top;
  55.         s->top = p;
  56. }


  57. void Traverse_stack( PSTACK s )                //遍历stack
  58. {
  59.         PNode p = s->top;
  60.         while( NULL != p )
  61.         {
  62.                 p = p->next;
  63.                 printf("%d",p->data);
  64.         }
  65.         printf("\n");
  66. }


  67. void Pop_stack(PSTACK s)                        //出栈
  68. {

  69.         if( NULL != s )
  70.         {
  71.                 PNode temp = s->top;
  72.                 s->top = s->top->next;
  73.                 printf("Pop data of %d ",temp);
  74.                 free(temp);
  75.                 temp = NULL;
  76.                 printf("Pop Success!\n");
  77.         }
  78.         else
  79.         {
  80.                 printf("The is Stack of empyt!\n");
  81.         }
  82. }


  83. void Clear_stack(PSTACK s)                        //清除栈
  84. {
  85.         PNode p = NULL;
  86.         PNode temp = NULL;                                //初始化临时指针
  87.         while( NULL != p )
  88.         {
  89.                 p = s->top;
  90.                 s->top = s->top->next;
  91.                 free(p);
  92.                 p = NULL;
  93.         }
  94.         free(p);
  95.         printf("释放Stack success!\n");
  96. }
复制代码

最佳答案
2018-6-20 20:59:13
理想小青年 发表于 2018-6-20 20:39
男神 是不是PSTACK s 在主函数中为初始化 所以s->bottom指针指向新的节点(结构体地址)时候返回malloc错 ...

一级指针可以修改普通变量的值
二级指针可以修改一级指针的指向
三级指针可以修改二级指针的指向

  1. #if 0
  2. #include <stdio.h>

  3. void ChangePointer(char *p)
  4. {
  5.         p = NULL;
  6. }

  7. int main(void)
  8. {
  9.         char ch = 'A';
  10.         char *p = &ch;

  11.         printf("%c\n", *p);
  12.         ChangePointer(p);
  13.         if(p)
  14.                 printf("%c\n", *p);

  15.         return 0;
  16. }
  17. #else
  18. #include <stdio.h>

  19. void ChangePointer(char **p)
  20. {
  21.         *p = NULL;
  22. }

  23. int main(void)
  24. {
  25.         char ch = 'A';
  26.         char *p = &ch;

  27.         printf("%c\n", *p);
  28.         ChangePointer(&p);
  29.         if(p)
  30.                 printf("%c\n", *p);

  31.         return 0;
  32. }
  33. #endif
复制代码


1.png
2.png

栈结构

栈结构

问题

问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-6-20 16:19:17 | 显示全部楼层
贴上汇编代码 半懂非懂
P{XRCKAC)WKX9ND53}}$O]U.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-20 16:26:25 | 显示全部楼层
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-20 18:14:21 | 显示全部楼层
本帖最后由 关键是感觉 于 2018-6-20 18:18 编辑
  1. #include "stdio.h"
  2. #include "malloc.h"
  3. typedef struct sData{
  4.         char n;
  5. }sData;


  6. typedef struct sStack{
  7.         sData *  back;
  8.         sData *  top;
  9.         int size;
  10. }sStack;

  11. sStack  inital(int size){                                                                                                //初始化栈空间
  12.         sStack  p_stack;
  13.         p_stack.back = (sData *)malloc(sizeof(sData) * size);
  14.         p_stack.top = p_stack.back;
  15.         p_stack.size=size;
  16.         return p_stack;
  17. }

  18. int is_overflow(sStack *stack){                                                                                                  //检查栈顶
  19.         return (stack->top-stack->back)>stack->size-1 || (stack->top<stack->back);//LOOP 栈
  20. }
  21. void push(sStack *stack,int n){
  22.         if(is_overflow(stack)){
  23.                 stack->top=stack->back;                                                                                        //溢出栈顶后置零
  24.         }
  25.         stack->top->n=n;
  26.         stack->top++;                                                                                                                //栈顶+1
  27. }

  28. int is_overflow1(sStack *stack){                                                                                //检查栈底
  29.         return stack->back>=stack->top;
  30. }
  31. sData * pop(sStack *stack){                                                                                                //栈顶-1                                                       
  32.         if(is_overflow1(stack)){                                       
  33.                 stack->top=stack->back+stack->size;                                                                //LOOP 栈
  34.         }
  35.         return --stack->top;
  36. }

  37. int main(){
  38.         sStack  p_stack,p_stack1;
  39.         int i=0,count=0;
  40.         char ch;
  41.         p_stack  = inital(100);
  42.         p_stack1 = inital(100);

  43.         while((ch=getchar())!='\n'){
  44.                 switch(ch){
  45.                 case        '#':                                                                                                        //前一个字符无效
  46.                         count-=1;
  47.                         p_stack.top-=1;                                                                                               
  48.                         break;
  49.                 case        '@':                                                                                                        //全部无效
  50.                         count=0;
  51.                         p_stack.top=p_stack.back;                                                                        //清空
  52.                         break;
  53.                 default:
  54.                         count++;
  55.                         push(&p_stack,ch);
  56.                         break;
  57.                 }
  58.         }

  59.         count=p_stack.top-p_stack.back;
  60.         for(i=0;i<count;i++){
  61.                 char ch =(*pop(&p_stack)).n;
  62.                 //printf("%c",ch);
  63.                 push(&p_stack1,ch);
  64.         }

  65.         for(i=0;i<=count;i++){
  66.                 printf("%c",(*pop(&p_stack1)).n);
  67.         }

  68.         free(p_stack.back);
  69.         free(p_stack1.back);
  70.         return 0;
  71. }
复制代码

这个《C语言经典编程282例》208题,大概效果是这样
输入:12346#5
输出:12345  “#相当于退格一位”
输入:123465@abcd
输出:abcd “应该不难理解这个效果吧”
其实程序简单。就是 压栈 出栈 初始化栈区域 还有栈顶溢出检查 栈底溢出检查。

QQ拼音截图20180620155908.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-20 20:39:32 | 显示全部楼层

男神 是不是PSTACK s 在主函数中为初始化 所以s->bottom指针指向新的节点(结构体地址)时候返回malloc错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-20 20:40:42 | 显示全部楼层
本帖最后由 理想小青年 于 2018-6-20 20:57 编辑
关键是感觉 发表于 2018-6-20 18:14
这个《C语言经典编程282例》208题,大概效果是这样
输入:12346#5
输出:12345  “#相当于退格一位”


需要好好理解一下 多谢!
突然感觉申请内存malloc这一段代码有技巧  相对多次循环申请malloc临时内存空间来说 一次申请效率更快
但是交互性差 一次输入多个values 一次性  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-20 20:59:13 | 显示全部楼层    本楼为最佳答案   
理想小青年 发表于 2018-6-20 20:39
男神 是不是PSTACK s 在主函数中为初始化 所以s->bottom指针指向新的节点(结构体地址)时候返回malloc错 ...

一级指针可以修改普通变量的值
二级指针可以修改一级指针的指向
三级指针可以修改二级指针的指向

  1. #if 0
  2. #include <stdio.h>

  3. void ChangePointer(char *p)
  4. {
  5.         p = NULL;
  6. }

  7. int main(void)
  8. {
  9.         char ch = 'A';
  10.         char *p = &ch;

  11.         printf("%c\n", *p);
  12.         ChangePointer(p);
  13.         if(p)
  14.                 printf("%c\n", *p);

  15.         return 0;
  16. }
  17. #else
  18. #include <stdio.h>

  19. void ChangePointer(char **p)
  20. {
  21.         *p = NULL;
  22. }

  23. int main(void)
  24. {
  25.         char ch = 'A';
  26.         char *p = &ch;

  27.         printf("%c\n", *p);
  28.         ChangePointer(&p);
  29.         if(p)
  30.                 printf("%c\n", *p);

  31.         return 0;
  32. }
  33. #endif
复制代码


1.png
2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-20 21:01:33 | 显示全部楼层
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-20 22:30:01 | 显示全部楼层
理想小青年 发表于 2018-6-20 20:40
需要好好理解一下 多谢!
突然感觉申请内存malloc这一段代码有技巧  相对多次循环申请mallo ...

我感觉没什么可理解的。简单的就是压栈 出栈 和初始化。功能可以慢慢加,比如获取栈区第几个元素等。
还有一点。其实压栈也可以一次性操作。比如 push(stack,带入数组) 或者 push(stack,...)采用可变参数到方式,类似printf函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 01:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表