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、程序代码区存放函数体(类成员函数和全局函数)的二进制代码。
手动分配的内存属于堆区,所以是不会被释放掉的,需要手动释放。所以数据能够保存下来返回。非静态的局部变量由编译器分配至栈区,被释放所以无法返回。
补充:软件开发 , C语言 ,