c - 具有使用指针的基于数组的堆栈的 C 程序
问题描述
这是我的代码,它不起作用。有任何想法吗?我不能根据给定的赋值更改主函数或任何函数名称或参数,我只能更改函数的内容。我超级卡住了。任何帮助表示赞赏。我已经在推送功能上运行了 GDB,它似乎工作得很好。但是,打印堆栈函数认为数组的长度为0,这根本没有帮助。非常感谢!
typedef int *stack;
void push (stack st, int num)
{
int len = st[0];
st[len+1]=num;
st[0]++;
}
int pop(stack st)
{
int len = st[0], x;
x = st[len];
st[0]--;
return x;
}
void printstack(stack st)
{
int i, len= st[0];
for(i=1;i<=len;i++)
{
printf("%d ", st[i]);
}
}
stack makestack()
{
stack n;
int arr[20];
n = malloc(sizeof(stack));
arr[0]=0;
n= arr;
return n;
}
int main()
{
stack s;
stack t;
s = makestack();
t = makestack();
int x;
push(s, 4);
push(s, 6);
push(t, 7);
push(t, 5);
printstack(s);
printstack(t);
x = pop(s);
printf("%d popped from s\n", x);
printstack(s);
printstack(t);
}
解决方案
你有未定义的行为,因为
stack n;
int arr[20];
n = malloc(sizeof(stack));
arr[0]=0;
n= arr;
return n;
arr
是局部变量,makestack
一旦控制退出就会被销毁makestack
。因此,您将进一步提到无效内存。
因此更改makestack
为如下。
stack makestack()
{
stack n = malloc(sizeof(int)*20);
n[0]=0;
return n;
}
注意:对指针进行类型定义是错误的,请避免使用它。
typedef int *stack; //bad
推荐阅读
- flutter - Flutter - 如何创建一个框架,我可以在其中拥有调试版本和生产版本,其中调试版本可以通过某种方式选择测试环境
- r - 根据 R 中数据集中进一步向下的观察创建变量
- c++ - 在 C 中实现的平均 DC 估计器的解释
- javascript - 如何修复 javascript 的运行方式并整合页面在所有类型选项卡中的加载方式
- python - 将 pandas DataFrame 中的日期时间值与特定的 data_time 值进行比较并返回壁橱
- ios - 当应用程序因缺乏最近使用而被 iOS 自动卸载时,本地 Realm DB 会发生什么情况?
- python - Python Serverless (SLS):Runtime.ImportModuleError:无法导入模块
- linux - 多行字符串搜索输出到一行
- c++ - 标准::向量
<=> Qvariant - amazon-ecs - 为 ECS 服务创建新任务定义并删除旧任务定义