从main返回指针

时间:2016-02-03 21:07:14

标签: c function pointers

我想知道是否可以从c中的main函数返回指针地址。这是一个非常简短的例子:

int main(){
  int i = 0;
  return &i; //won't work because of type difference and because i..
}            //.. will be deallocated.

有没有办法做到这一点? 第二:我想这样做是为了将堆对象从一个程序返回到另一个程序..

如果被调用的程序在main()上终止但是继续在从main启动的第二个线程上运行,是否可以使堆对象保持活动状态?

提前致谢!

4 个答案:

答案 0 :(得分:6)

简而言之,答案是否定的。

main()的返回值通常用于错误代码。在流程结束后要保持持久的数据应以其他方式传达。从main()返回时,您的进程(及其所有线程)已结束。操作系统为进程分配的内存空间也已被释放。这包括你的堆内存。简而言之,一旦进程结束,就没有堆,并且堆中的对象消失了。

您似乎发现了进程间通信的难度。有许多可能的技术允许一个进程与另一个进程通信。 其中一些

有些技术更适合不同的情况,这就是为什么有多种选择。

答案 1 :(得分:1)

  

如果被调用的程序在main()上终止但是继续在从main启动的第二个线程上运行,是否可以使堆对象保持活动状态?

不,不是。从main返回时,相当于调用exit。因此,程序终止。之后没有线程可以活着。

来自C99标准:

  

5.1.2.2.3程序终止

     

1如果main函数的返回类型是与int兼容的类型,则从初始调用到main函数的返回等同于调用exit使用main函数返回的值作为参数的函数;

答案 2 :(得分:1)

您不能在严格遵守的程序中退回,也不能在大多数实施中退货 根据C11标准草案N1570,§5.1.2.2.1:

  

程序启动时调用的函数名为main。 [...]它应该   使用返回类型int定义并且没有参数:

int main(void) { /* ... */ }
     

或有两个参数[...]:

int main(int argc, char *argv[]) { /* ... */ }
     

[...]或其他一些实施定义的方式。

将指针移动到int是可能的,但这将是实现定义的,可能是未定义的,并且......讨厌。

  

如果调用程序,是否可以使堆对象保持活动状态   终止于main(),但继续在第二个线程上运行   这是从main

开始的

程序是流程。 main在一个帖子中运行。堆内存在所有线程之间共享,所以是的,完全可以在线程之间共享堆内存 但是,main返回等同于程序终止,因此您需要找到另一种在线程之间共享它的方法。一个例子是在一个线程中设置指向堆内存的指针(可能使该线程产生),并在其他线程中使用该指针。

  

我想这样做是为了将堆对象从一个程序返回到   anotherone ..

现在,进程或线程之间是什么?堆内存在线程之间共享,但在多个进程之间。使用共享内存mmapshmopenshmget等)在多个进程之间共享。

答案 3 :(得分:0)

两个问题:

  1. main返回时,i不再存在;您返回的任何指针值都将无效。

  2. 我不知道任何运行时环境需要从任何已执行的程序接收指针值; main返回int,因为运行时环境需要int