即使我没有使用任何return语句,函数如何将指针返回到创建的节点。因此,节点中的值成功打印。怎么样?
#include <stdio.h>
#include"stdlib.h"
struct node
{
int data;
struct node *next;
};
main ()
{
struct node *nl=fun();
printf("%d",nl->data);
}
fun ()
{
struct node *p= (struct node*)malloc(sizeof (struct node));
scanf("%d", &(p->data));
p->next=NULL;
}
答案 0 :(得分:1)
旧版本的C允许函数不指定返回类型,返回类型自动为int
。
如果声明一个函数返回一个值(显式地,或者在你的情况下隐式),那么它必须返回一个值,否则你将undefined behavior。
另请注意,在旧版本的C中,编译器会自动声明以前从未见过的函数。这个和隐式返回类型都很容易出错,因此被C99标准删除了。
最后关于使用int
指针的说明:通常在计算机历史记录中,指针和int
不相等。例如,现在,在64位系统上,指针通常是64位,而int
是32位。无论你怎么努力,你都无法在32位int
中使用64位指针。这是should never cast the result of malloc
的一个原因。
答案 1 :(得分:1)
对于本声明
struct node *nl=fun(); /* here nl expecting something from fun() but
you didn't return anything, in your case default int is
returning, which can cause serious problem as
nl expects valid address */
您的编译器可能已经警告过您
错误:返回类型默认为'int'[-Werror = return-type]
如果您使用-Wall -Wstrict-prototypes -Werror
选项编译了程序,则行为未定义。
正确的版本可能是
struct node* fun (void) {
struct node *p= malloc(sizeof (struct node)); /* avoid casting result of malloc() */
scanf("%d", &(p->data));
p->next=NULL;
return p; /* return the dynamic memory so that you can do
nl->data in main() as you are doing */
}
同样只是main () { /*code */ }
不是一个好习惯,请使用{C}标准https://port70.net/~nsz/c/c11/n1570.html#5.1.2.2.1p2中指定的int main(void) { /* code */ }
。