我想知道是否可以从c中的main函数返回指针地址。这是一个非常简短的例子:
int main(){
int i = 0;
return &i; //won't work because of type difference and because i..
} //.. will be deallocated.
有没有办法做到这一点? 第二:我想这样做是为了将堆对象从一个程序返回到另一个程序..
如果被调用的程序在main()上终止但是继续在从main启动的第二个线程上运行,是否可以使堆对象保持活动状态?
提前致谢!
答案 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 ..
现在,进程或线程之间是什么?堆内存在线程之间共享,但在多个进程之间不。使用共享内存(mmap
或shmopen
,shmget
等)在多个进程之间共享。
答案 3 :(得分:0)
两个问题:
当main
返回时,i
不再存在;您返回的任何指针值都将无效。
我不知道任何运行时环境需要从任何已执行的程序接收指针值; main
返回int
,因为运行时环境需要int
。