内存动态分配问题

top啦它 2020-04-22 06:48:38
代码应该是malloc分配内存那里出错了,但是不知道怎么修改。干瞪眼两个小时,也没改出来。求修改,谢谢了。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define sizezifu 50000
#define new_size 50
typedef struct{
char **top;
char **base;
int size_top_base;
}zifu;
void init_zifu(zifu *s)
{
s->base = (char **)malloc(sizeof(char*)*new_size);
if(!(*(s->base)))
exit(-1);
*(s->top) = *(s->base);
s->size_top_base = 0;
}
void push(zifu *s,char *st_r1)
{
s->top[s->size_top_base] = (char *)malloc(sizeof(char) * sizezifu);
strcpy(s->top[s->size_top_base],st_r1);
s->size_top_base += 1;
}
void pop(zifu *s)
{
for(int i = 0;i < s->size_top_base;i++)
{
printf("%s\n",s->top[i]);
}
}
int main(void)
{
char st_r[20];
zifu *s;
init_zifu(s);
while(scanf("%s",st_r) != EOF)
{
char st_r1[300];
switch(st_r[0])
{
case 'E':
scanf("%s",st_r1);
push(s,st_r1);
break;
case 'B':
s->size_top_base -= 1;
break;
case 'F':
s->size_top_base += 1;
break;
case 'Q':
pop(s);
}
}
return 0;
}

题目:
Input

有多行文本执行命令:
EDIT 字符串:代表编辑一行新文本并保存。
FORWARD:代表前进到下一个文本状态。
BACK:代表回到上一个文本状态。
QUIT:表示输入数据结束
说明:每个状态的文本内容最多不超过10000个英文字符;当遇到回车既是点击保存按钮,最多50个状态。
第一行一定是一个以EDIT开始的命令行,且作为第一个状态,也就是没有空白状态。


Output

所有命令执行结束时,阿美编写的小说内容。


Sample Input
EDIT 50年前,长沙镖子岭。
EDIT 四个土夫子正蹲在一个土丘上,所有人都不说话,直勾勾地盯着地上那把洛阳铲。
EDIT 铲子头上带着刚从地下带出的旧土,离奇的是,这一坏土正不停地向外渗着鲜红的液体......
EDIT “这下子麻烦大喽。”老烟头把他的旱烟在地上敲了敲,接着道,“下面是个血尸嘎,弄不好我们这点儿当当,都要撂在下面噢。”
BACK
BACK
BACK
FORWARD
QUIT

Sample Output
50年前,长沙镖子岭。
四个土夫子正蹲在一个土丘上,所有人都不说话,直勾勾地盯着地上那把洛阳铲。
...全文
84 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
top啦它 2020-04-22
  • 打赏
  • 举报
回复
引用 2 楼 qybao 的回复:
这是常见问题 函数里改变参数指针的指向,不影响函数外指针的指向 所以,要么 void init_zifu(zifu **s) //改成双指针 要么 void init_zifu(zifu *&s) //改成指针引用 要么 zifu* init_zifu() //改成返回值是指针 以最少修改量的方式 void init_zifu(zifu *&s) { s = (zifu*)malloc(sizeof(zifu)); //先给s分配内存 s->base= (zifu**)malloc(sizeof(char*)*newsize); if (!s->base) { exit(-1); } s->top = s->base; s->size_of_base = 0; }
谢谢大哥,一下就懂了。谢谢了。
qybao 2020-04-22
  • 打赏
  • 举报
回复
这是常见问题 函数里改变参数指针的指向,不影响函数外指针的指向 所以,要么 void init_zifu(zifu **s) //改成双指针 要么 void init_zifu(zifu *&s) //改成指针引用 要么 zifu* init_zifu() //改成返回值是指针 以最少修改量的方式 void init_zifu(zifu *&s) { s = (zifu*)malloc(sizeof(zifu)); //先给s分配内存 s->base= (zifu**)malloc(sizeof(char*)*newsize); if (!s->base) { exit(-1); } s->top = s->base; s->size_of_base = 0; }
top啦它 2020-04-22
  • 打赏
  • 举报
回复
多谢了

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧