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、程序代碼區存放函數體(類成員函數和全局函數)的二進制代碼。
手動分配的內存屬於堆區,所以是不會被釋放掉的,需要手動釋放。所以數據能夠保存下來返回。非靜態的局部變量由編譯器分配至棧區,被釋放所以無法返回。