当前位置:编程学习 > 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、程序代码区存放函数体(类成员函数和全局函数)的二进制代码。
 
 
手动分配的内存属于堆区,所以是不会被释放掉的,需要手动释放。所以数据能够保存下来返回。非静态的局部变量由编译器分配至栈区,被释放所以无法返回。
补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,