C++面试程序员

C 堆变量,栈变量,指针参数,非指针参数 它们的区别你了解嘛

2017-03-26  本文已影响57人  Linux后端研发工程实践

1.基本概念

-堆变量(Heapvariables)
数据存储在堆的变量,全局可访问。

2.进程的虚拟地址空间

进程虚拟地址空间

3.相关问题剖析

3.1 如何正确的分配内存

demo代码

void * fun_m1()
{
    char buf[100];
    return (void *)buf;
}

void * fun_m2(size_t size)
{
    return malloc(size);
}

void fun_m3(size_t size, void * p)
{
    p = malloc(size);
}

void fun_m4(size_t size, void ** p)
{
    *p = malloc(size);
}

剖析

3.2 如何判断堆和栈的“增长”方向(从低到高,还是从高到低)

判断栈的“增长”方向

#include <stdio.h>
#include <malloc.h>

void fun1(int * pb)
{
    int a;
    printf("stack alloc direction[%s]\n", &a > pb ? "Up" : "Down");
}

void fun2()
{
    int b;
    fun1(&b);
}

int main()
{
    fun2();
    return 0;
}

编译运行

[root@iZ940zytujjZ test]# gcc -o test10 test10.c
[root@iZ940zytujjZ test]# ./test10
stack alloc direction[Down]
[root@iZ940zytujjZ test]#

从运行结果看,栈的增长方向是“从高到低”(Down)。

判断堆的“增长”方向

#include <stdio.h>
#include <unistd.h>
#include <malloc.h>

int main()
{
    void * a = sbrk(10);    //调整堆顶指针brk
    void * b = sbrk(20);
    printf("heap alloc direction[%s]\n", b > a ? "Up" : "Down");
    return 0;
}

编译运行

[root@iZ940zytujjZ test]# gcc -o test11 test11.c
[root@iZ940zytujjZ test]# ./test11
heap alloc direction[Up]
[root@iZ940zytujjZ test]#

从运行结果看,堆的增长方向是“从低到高”(Up)。

上一篇 下一篇

猜你喜欢

热点阅读