当前位置:  开发笔记 > 编程语言 > 正文

C:没有显式返回构造的结构,但它仍然有效

如何解决《C:没有显式返回构造的结构,但它仍然有效》经验,为你挑选了1个好方法。

我编写了一个'构造函数'函数,它在C语言中创建一个Node,使用Visual Studio 2008,ANSI C模式编译.

#include 
#include 

typedef struct _node
{
  struct _node* next ;
  char* data ;
} Node ;

Node * makeNode()
{
  Node * newNode = (Node*)malloc( sizeof(Node) ) ;

  // uncommenting this causes the program to fail.
  //puts( "I DIDN'T RETURN ANYTHING!!" ) ;
}

int main()
{
  Node * myNode = makeNode() ;
  myNode->data = "Hello there" ;

  // elaborate program, still works

  puts( myNode->data ) ;

  return 0 ;
}

令我惊讶的是:

*不从makeNode()返回值只是一个警告,

*更令人惊讶的是makeNode()_ _ ttill有效_只要我不放()任何东西!

这里发生了什么,这样做是否"好"(不返回你在C'构造函数'函数中创建的对象?)

为什么它仍然有效?为什么puts()命令会导致程序失败?



1> CB Bailey..:

没有返回任何东西的原因是警告,而不是错误可能在很大程度上是历史性的.在'传统'C中,函数不需要声明它们的默认返回类型int.有些函数是在没有显式返回类型的情况下编写的,并且没有返回任何内容,其他函数选择返回有意义的内容,但仍未声明返回类型.试图收紧退货声明或缺乏退货声明意味着打破了许多旧式代码.

它可能会发生工作,但你所看到的是依赖于无法保证的事情.

可能发生的是函数的返回值进入特定寄存器.在您调用之后malloc,如果您不执行任何操作并且在函数结束时,函数malloc将返回返回的内容,因为在该函数调用之后结果仍然位于返回寄存器中.

如果调用其他函数,则返回值将malloc丢失,函数返回的内容是返回寄存器中的最终结果.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有