程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言返回數組的一些碎碎念

C語言返回數組的一些碎碎念

編輯:關於C語言

C語言是不能直接返回數組的全部內容的,不像php這種弱類型的語言。
 
php實例:
 
[php] 
function refunc() { 
$a = array("foo" => "bar","hello" => "world"); 
return $a; 

$value = refunc(); 
echo $value["foo"]; 
 
 
這樣會得到值"bar"。
 
C裡不能返回局部數組(局部數組由棧分配內存,在函數體執行完之後會銷毀,因而得到的將是一串亂碼,而且得到的亂碼將是固定的,除非重新編譯,然而每次得到的結果前面一部分都會重合),除非把他聲明為靜態變量。
 
每一次結果前面一小段都是一樣的,因為每一次匯編編譯產生的代碼,只有我們能夠使用到的地方才會從新匯編,其他的代碼由編譯器產生是不變的。如果我們修改C中數組內容(紅色部分),在匯編代碼中改變的也僅有一部分(紅色部分)。這樣大概就可以說清楚前面為什麼一部分固定,另一部分卻不定的原因(因為指針不知道指到哪裡去了)。
 
C語言代碼:
 
[cpp] 
#include <stdio.h> 
char* str() { 
char str2[10] = "askdfjk"; 
return str2; 

int main() 

printf("%s",str()); 
return 0; 

 
 
匯編代碼:
 
[plain] 
.file"b.c" 
.text 
.globl_str 
.def_str;.scl2;.type32;.endef 
_str: 
LFB6: 
.cfi_startproc 
pushl%ebp 
.cfi_def_cfa_offset 8 
.cfi_offset 5, -8 
movl%esp, %ebp 
.cfi_def_cfa_register 5 
subl$16, %esp 
movl$1684763489, -10(%ebp) 
movl$7039590, -6(%ebp) 
movw$0, -2(%ebp) 
leal-10(%ebp), %eax 
leave 
.cfi_restore 5 
.cfi_def_cfa 4, 4 
ret 
.cfi_endproc 
LFE6: 
.def___main;.scl2;.type32;.endef 
 
 
;......(省略)
 
 
 
另外出現這樣的情況:
 
[cpp] 
#include <stdio.h> 
#include <stdlib.h> 
  
char* str() { 
//static char str2[10] = "absbsb"; 
char *str2 = malloc(10 * sizeof(*str2)); 
str2 = "ababab"; 
return str2; 

int main() 

char *p; 
p = str(); 
printf("%s",p); 
free(p); 
return 0; 

 
 
手動分配內存的情況,返回也是正確的。
 
 
 
//程序的內存空間<from:http://blog.csdn.net/jing0611/article/details/4030237>
一個程序將操作系統分配給其運行的內存塊分為4個區域,如下圖所示。
代碼區(code
 area)
 
 
 
程序內存空間
 
全局數據區(data
 area)              
 
堆區(heap area)
 
棧區(stack
 area)
 
一個由C/C++編譯的程序占用的內存分為以下幾個部分,
1、棧區(stack)   由編譯器自動分配釋放 ,存放為運行函數而分配的局部變量、函數參數、返回數據、返回地址等。其操作方式類似於數據結構中的棧。
2、堆區(heap)    一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。分配方式類似於鏈表。
3、全局區(靜態區)(static)存放全局變量、靜態數據、常量。程序結束後有系統釋放
4、文字常量區 常量字符串就是放在這裡的。 程序結束後由系統釋放。
5、程序代碼區存放函數體(類成員函數和全局函數)的二進制代碼。
 
 
手動分配的內存屬於堆區,所以是不會被釋放掉的,需要手動釋放。所以數據能夠保存下來返回。非靜態的局部變量由編譯器分配至棧區,被釋放所以無法返回。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved