簡體   English   中英

從main返回指針

[英]Return pointer from main

我想知道是否可以從c中的main函數返回指針地址。 這是一個很短的例子:

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

有沒有辦法做到這一點? 第二:我想這樣做是為了將堆對象從一個程序返回到另一個程序。

如果被調用的程序在main()上終止但是繼續在從main啟動的第二個線程上運行,是否可以使堆對象保持活動狀態?

提前致謝!

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

main()的返回值通常用於錯誤代碼。 在流程結束后要保持持久的數據應以其他方式傳達。 main()返回時,您的進程(及其所有線程)已結束。 操作系統為進程分配的內存空間也已被釋放。 這包括你的堆內存。 簡而言之,一旦進程結束,就沒有堆,並且堆中的對象消失了。

您似乎發現了進程間通信的難度。 有許多可能的技術允許一個進程與另一個進程通信。 其中一些

有些技術更適合不同的情況,這就是為什么有多種選擇。

如果被調用的程序在main()上終止但是繼續在從main啟動的第二個線程上運行,是否可以使堆對象保持活動狀態?

不它不是。 當你從main返回時,它相當於調用exit 因此,程序終止。 之后沒有線程可以活着。

從C99標准:

5.1.2.2.3程序終止

1如果main函數的返回類型是與int兼容的類型,則從初始調用到main函數的返回等同於調用exit函數,其中main函數返回的值作為其參數;

您不能在嚴格符合的程序中返回它,也不能在大多數實現中返回它。
根據C11標准草案N1570,§5.1.2.2.1:

程序啟動時調用的函數名為main [...]應使用返回類型int定義並且不帶參數:

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

或者有兩個參數[...]:

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

[...]或以其他一些實施方式定義的方式。

將指針移動到int是可能的,但這將是實現定義的,可能是未定義的,並且......令人討厭。

如果被調用的程序在main()上終止但是繼續在從main啟動的第二個線程上運行,是否可以使堆對象保持活動狀態?

一個程序就是程序。 main運行在一個線程中。 堆內存在所有線程之間共享,所以是的,完全可以在線程之間共享堆內存。
但是, main返回等同於程序終止,因此您需要找到另一種在線程之間共享它的方法。 一個例子是在一個線程中設置指向堆內存的指針(可能使該線程產生),並在其他線程中使用該指針。

我想這樣做是為了將堆對象從一個程序返回到另一個程序。

現在,進程或線程之間是什么? 堆內存在線程之間共享,但不在多個進程之間共享。 使用共享內存mmapshmopenshmget等)完成多個進程之間的共享

兩個問題:

  1. main回歸時, i不再存在; 您返回的任何指針值都將無效。

  2. 我不知道任何期望從任何執行的程序接收指針值的運行時環境; main返回一個int因為運行時環境需要一個int

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM