gpt4 book ai didi

c - 即使没有 return 语句,函数也返回预期值

转载 作者:太空宇宙 更新时间:2023-11-04 05:57:04 25 4
gpt4 key购买 nike

我这里有一个函数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。

最佳答案

无论编译器是否诊断它,如果函数有一个非 void 返回类型。这是未定义的行为

现在,未定义的行为可以以多种不同的方式表现出来。它可能会导致您的程序崩溃、接收到错误的值、删除您的硬盘、向您的母亲发送令人讨厌的电子邮件,或者看起来工作成功而没有其他不良影响。 C 语言标准允许所有这些行为。仅仅因为代码可能看起来可以正常工作,并不意味着它实际上是正确的并且可以正常工作。

如果您在调用未定义行为时崩溃,您应该认为自己很幸运,因为这些通常很容易诊断。但是,如果您的程序悄无声息地破坏了内存,然后在“不可能”的情况下崩溃,那么您将面临一项艰巨的调试工作。

故事的寓意:使用高警告级别编译代码(例如使用 -Wall 编译器选项;可能还有 -Wextra 和/或 -迂腐如果你能忍受的话;-Werror也强烈推荐)。任何称职的编译器都会捕获此类错误,但通常不会处于默认警告级别

关于c - 即使没有 return 语句,函数也返回预期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25678322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com