堆与栈的区别? 一个是先进先出,一个是先进后出 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般认为在c中分为这几个存储区 1栈 - 有编译器自动分配释放 2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束释放 4另外还有一个专门放常量的地方。 - 程序结束释放 在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。 比如: int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc";栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。 } 还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。 栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。 堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。 在栈上存取数据比通过指针在堆上存取数据快些。 一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap. 栈是先入后出的,一般是由高地址向低地址生长。 ///////////////////////////////////////////////////////////////////////////////////////////////////Author: Lei Zhengdeng//E-mail: [email protected]//Homepage: http://arden.3322.net//Date: Nov 19, 2001///////////////////////////////////////////////////////////////////////////////////////////////////One dimensionchar s1[5] = "abcd";char *p11 = "1234567";char *p12;static int i = 1;int j = 0x99;p12 = (char *)malloc(sizeof(char)*10);| 00 || 00 || 00 || 01 | 0x004232e8 &i stack| | .....| | | 00 | 0x0012ff7c | | 0x00420f90| 'd' | | 00 || 'c' | | '7' | | 'b' | | '6' || 'a' | 0x0012ff78 s1 | '5' | 0x00420f8c| 00 | | '4' | | || 42 | | '3' | | || 0f | | '2' | | || 88 | 0x0012ff74 &p11-------------> | '1' | 0x00420f88 p11 | | 0x00430134| 00 | | | | 43 | | || 01 | | || 10 | 0x0012ff70 &p12-------------------------------------------> | | 0x00430110 p12| 00 || 00 || 00 || 99 | 0x0012ff6c &j///////////////////////////////////////////////////////////////////////////////////////////////////Two dimensionschar s2[2][3] = { {'1', '2', '3'}, {'a', 'b', 'c'}};char *p21[2];char (*p22)[3];char **p23;for(int i=0; i <= 1; i++){p21[i] = (char *)malloc(sizeof(char)*3);strcpy(p21[i], "xx");}for( i=0; i <= 1; i++){free(p21[i]);}p22 = s2;p23 = (char **)malloc(sizeof(char *)*2);for( i = 0; i <=1; i++){p23[i] = (char *)malloc(sizeof(char)*3);strcpy(p23[i], "yy");}for( i=0; i <= 1; i++){free(p23[i]);}free(p23);stack | || | | 'c' | | 'b' | 0x0012ff7c | 'a' | s2[1] | '3' | | '2' | | '1' | 0x0012ff78 s2 s2[0] | 00 | | 43 | | 00 | | 01 | | 'x || 10 | 0x0012ff74 &p21[1]--> | 'x' | 0x00430110| 00 | | 43 | | 00 | | 01 | | 'x' | | 'c' || 40 | 0x0012ff70 p21 &p21[0]---> | 'x' | 0x00430140 | 'b' || 00 | | 'a' | 0x0012ff7b p22+1 | 00 || 12 | | '3' | | 43 | | 00 || ff | | '2' | | 00 | | 'y' || 78 | 0x0012ff6c &p22------------------------------> | '1' | 0x0012ff78 p22 | 70 | 0x004300d4 p23+1---> | 'y' | 0x00430070| 00 | | 00 || 43 | | 43 | | 00 || 00 | | 00 | | 'y' | | d0 | 0x0012ff68 &p23--------------------------------------------------------> | a0 | 0x004300d0 p23------> | 'y' | 0x004300a0| || || || | 0x0012ff64 | || || || | 0x0012ff60| || || || | 0x0012ff6c =rand(200,90) 构造函数的疑问 请教基于pictureBox的自定义控件resize问题 Split('|') 请问各位,有没有关于C#的多线程方面的书? c#怎样才能在winform里输入,在控制台里显示输入内容? 我想实现点一下按钮,另一个按钮显示出来。应如何写呀,可以告诉我吗,我是一个新手呀,帮帮忙好吗 汉字换转成双字节后如何再换回汉字?? 怎样在删除之前做确认????????? WPF使用FileSystemWatcher遇到问题了.. RichTextBox保存到数据库,及从数据库读取的问题请教。 关于remoting中使用的配置文件的问题!! 请教:关于SqlDataAdapter.Update
1栈 - 有编译器自动分配释放
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束释放
4另外还有一个专门放常量的地方。 - 程序结束释放
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
比如:
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc";栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
}
还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。
堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。
在栈上存取数据比通过指针在堆上存取数据快些。
一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.
栈是先入后出的,一般是由高地址向低地址生长。
/////////////////////////////////////////////////////////////////////////////////////////////////
//Author: Lei Zhengdeng
//E-mail: [email protected]
//Homepage: http://arden.3322.net
//Date: Nov 19, 2001
/////////////////////////////////////////////////////////////////////////////////////////////////
//One dimension
char s1[5] = "abcd";
char *p11 = "1234567";
char *p12;
static int i = 1;
int j = 0x99;
p12 = (char *)malloc(sizeof(char)*10);| 00 |
| 00 |
| 00 |
| 01 | 0x004232e8 &i
stack
| | .....
| |
| 00 | 0x0012ff7c | | 0x00420f90
| 'd' | | 00 |
| 'c' | | '7' |
| 'b' | | '6' |
| 'a' | 0x0012ff78 s1 | '5' | 0x00420f8c
| 00 | | '4' | | |
| 42 | | '3' | | |
| 0f | | '2' | | |
| 88 | 0x0012ff74 &p11-------------> | '1' | 0x00420f88 p11 | | 0x00430134
| 00 | | |
| 43 | | |
| 01 | | |
| 10 | 0x0012ff70 &p12-------------------------------------------> | | 0x00430110 p12
| 00 |
| 00 |
| 00 |
| 99 | 0x0012ff6c &j
/////////////////////////////////////////////////////////////////////////////////////////////////
//Two dimensions
char s2[2][3] = { {'1', '2', '3'}, {'a', 'b', 'c'}};
char *p21[2];
char (*p22)[3];
char **p23;
for(int i=0; i <= 1; i++)
{
p21[i] = (char *)malloc(sizeof(char)*3);
strcpy(p21[i], "xx");
}
for( i=0; i <= 1; i++)
{
free(p21[i]);
}
p22 = s2;
p23 = (char **)malloc(sizeof(char *)*2);
for( i = 0; i <=1; i++)
{
p23[i] = (char *)malloc(sizeof(char)*3);
strcpy(p23[i], "yy");
}
for( i=0; i <= 1; i++)
{
free(p23[i]);
}
free(p23);stack
| |
| |
| 'c' |
| 'b' | 0x0012ff7c
| 'a' | s2[1]
| '3' |
| '2' |
| '1' | 0x0012ff78 s2 s2[0]
| 00 |
| 43 | | 00 |
| 01 | | 'x |
| 10 | 0x0012ff74 &p21[1]--> | 'x' | 0x00430110
| 00 |
| 43 | | 00 |
| 01 | | 'x' | | 'c' |
| 40 | 0x0012ff70 p21 &p21[0]---> | 'x' | 0x00430140 | 'b' |
| 00 | | 'a' | 0x0012ff7b p22+1 | 00 |
| 12 | | '3' | | 43 | | 00 |
| ff | | '2' | | 00 | | 'y' |
| 78 | 0x0012ff6c &p22------------------------------> | '1' | 0x0012ff78 p22 | 70 | 0x004300d4 p23+1---> | 'y' | 0x00430070
| 00 | | 00 |
| 43 | | 43 | | 00 |
| 00 | | 00 | | 'y' |
| d0 | 0x0012ff68 &p23--------------------------------------------------------> | a0 | 0x004300d0 p23------> | 'y' | 0x004300a0
| |
| |
| |
| | 0x0012ff64
| |
| |
| |
| | 0x0012ff60
| |
| |
| |
| | 0x0012ff6c
=rand(200,90)