【发布时间】:2014-09-05 03:44:41
【问题描述】:
我这里有一个函数get_stack,它实例化一个堆栈并应该返回一个指向堆栈的指针,但没有。尽管如此,程序仍会继续并正确更新堆栈。
#include <stdio.h>
#include <stdlib.h>
#define STACKLIM 1000
struct stack {
char data[STACKLIM];
int top;
};
typedef struct stack* Stack;
Stack get_stack() {
Stack s = (Stack)(malloc(sizeof(struct stack)));
s->top = -1;
//return s;
}
void push(Stack s, char val) {
if(s->top == STACKLIM) {
printf("ERROR: Stack Overflow\n");
}
else {
s->top += 1;
s->data[s->top] = val;
}
}
void display(Stack s) {
int i;
printf("Stack -> ");
for(i = 0; i <= s->top; i++) {
printf("%c ", s->data[i]);
}
printf("\n");
}
int main() {
Stack d = NULL;
d = get_stack();
push(d, 'a');
display(d);
return 0;
}
这就像return语句无关紧要。这可能是什么原因?我在 RH5 机器上使用 gcc 4.5.2。
【问题讨论】:
-
使用
-Wall编译时会发生什么?另外,请查看此链接:stackoverflow.com/questions/10079089/… -
您是否使用了任何优化标志?请记住,未定义的行为包括让您的程序神秘地工作。
-
当我使用
-Wall编译时,我得到了warning: control reaches end of non-void function,但程序仍然可以正常运行。 -
请记住,您已经定义了
Stack get_stack(),因此get_stack()被声明为返回类型struct stack *的函数——您只是缺少定义中的return 语句。我和hugomg 和AntonH 在一起。你已经被UB祝福了。 -
这是一个完全正常的意外。按照惯例,函数的返回值通过 CPU 寄存器传回。就像英特尔处理器的 EAX 一样。该寄存器很可能会意外包含指针,尤其是当您不打开优化器时。
标签: c