不同的編譯器、不同的平臺,實現的方式會有差別。理解這些至少需要一些前置知識:CPURegister(學過匯編的都知道)和Functioncallconvention。簡單地講,C函數只能返回array的指針。函數返回整型值和地址是使用的EAX寄存器(浮點型使用st0),由于局部變量數據是分配在棧上,函數返回后,棧會被清掉,原來局部變量指針指向的內存區域的數據就不再有保證了。要實現返回array指針后,仍然讀取到原來array的數據,則需要使用malloc。這東西解釋起來還有好多概念,你需要補的知識是這些:Callingconvention通常我們都是使用x86平臺,可以直接看這個:x86callingconventions更新我了個去,提問者竟然將代碼又改成C++,還問返回string結果是怎樣?題主你不會是看的譚浩強的C語言被誤導了吧?C中只不過有一個stringliteral,這個stringliteral的數據,是在編譯時寫到datasection中的,這部分在運行時其實是全局的,函數返回后,這部分數據仍然存在。而普通的array,是直接分配在棧上的。同理,變通的方案,如果你將函數局部變量標記成static,則它在函數返回后仍然存在,返回static變量的指針是work的。char*return_str(){char*s="hello";returns;}上面的代碼工作OK。因為"hello"是被分配到`.section.rodata`中的(如果只是staticchararray,則是`.section.data`),你也許注意到了rodata,說明這個string是不能被修改的,一修改就真的要上segmentfault提問題了。(標準C禁止修改字符串字面量)你要補的這方面的知識是這個:Datasegment如果還要尋根究底,則建議直接去看《ProfessionalAssemblyLanguage—RichardBlum》或《ComputerSystems:AProgrammer'sPerspective》