堆和栈的一些小疑问

来源:互联网 发布:用友软件u8下载 编辑:程序博客网 时间:2024/05/29 04:36

今天在课堂上的时候老师给出了下面一段程序,要求我们分析程序会出现什么问题:

#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){    char i[12] = "qweqqqewwwqq";    functionA(i);    printf("OK");    return 0;}//strcpy(char* a,const char* b)//函数要求a中要有足够的空间存储b中的字符串void functionA(char *i){    char j[5] ="qqqqw";    strcpy(j,i);    return;}

该程序编译运行后程序会崩溃。具体原因是因为strcpy(a,b)函数要求a中拥有足够的空间存储b中的字符串。

strcpy(a,b)函数是将b中的字符串拷贝到a中,不管a中是否有足够的空间。

当b中的字符串大于a中的空间时,程序会继续往b后的空间写入a的字符串。这时就会在不合法的内存位置写入。导致程序"跑飞"。


堆和栈中的存储内容 
栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可 
执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈 
的,然后是函数中的局部变量。注意静态变量是不入栈的。 
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地 
址,也就是主函数中的下一条指令,程序由该点继续运行。 
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。


原创粉丝点击