C语言程序猿必会的内存四区及经典面试题解析

 

前言:

    为啥叫C语言程序猿必会呢?因为特别重要,学习C语言不知道内存分区,对很多问题你很难解释,如经典的:传值传地址,前者不能改变实参,后者可以,知道为什么?还有经典面试题如下: 

复制代码
#include <stdio.h> #include <stdlib.h>
#include <stdlib.h>void getmemory(char *p) { p=(char *) malloc(100); } int main( ) { char *str=NULL; getmemory(str); strcpy(str,"hello world"); printf("%s/n",str); free(str); return 0; }
复制代码

  这段代码执行了会怎么样?接下里我会解释这道面试题。

  一、内存布局

  可能网上有很多把内存分的很多、很细,但觉得很难记,并对于理解问题作用并不大。现在主要将内存分为四区如下:

  代码区:存放代码;运行期间不可修改

  全局区:全局变量、静态变量、常量字符串;程序运行时存在,退出时消失。

  栈区:自动变量、函数参数、函数返回值;作用域函数内(代码块内)

  堆区:动态分配内存,需手动释放

  用交换两个数的程序进行解释吧,如下: 

复制代码
#include<stdio.h>void swap(int a,int b) {     int temp = a;    //    a = b;     b =temp; } int main() {     int a=1,b=2;    //    printf("a:%d,b:%d\n",a,b);     swap(a,b);     printf("a:%d,b:%d\n",a,b);      return 0; }
复制代码

  画个图进行讲解,如下:  PS:依旧是全博客园最丑图,不接受反驳!

  

  说明:main函数把a,b的值给了temp函数,temp函数在内部交换了值,并没有影响main函数,并且temp结束,栈上的数据释放。传值不会改变实参。

  二、程序示例及面试题讲解

  1、传地址交换两个数  

   在拿传指针的例子来说明一下,如下:

复制代码
#include<stdio.h>void swap(int *a,int *b) {     int temp = *a;    //    *a = *b;     *b =temp; } int main() {     int a=1,b=2;    //    printf("a:%d,b:%d\n",a,b);     swap(&a,&b);     printf("a:%d,b:%d\n"
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信