函数自动返回指针而没有返回语句

时间:2018-06-09 17:21:38

标签: c function pointers struct

即使我没有使用任何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;
}

2 个答案:

答案 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 */ }