前言

好几天没写了,最近网课,事情也比较多,今天多写点东西。

alloca函数

1.简介

之前看《30天自制操作系统》的时候,看见了这样一个东西:

没错,这就是alloca函数。

2.反汇编看alloca

现在,我们把VS打开,看看反汇编是如何的:

(顺便说一下反汇编的方法,就是下两个断点,如图)



然后左上角就会出现反汇编的页面,点进去

代码如下:

#include "stdafx.h"
#include<stdio.h>
#include<iostream>
#define N 100
int main(){
char a[N];
for(int i=1;i<=N;i++){
a[i]=0;
}
}

反汇编的结果是:

push        ebp
004D1381 8B EC mov ebp,esp
004D1383 81 EC 3C 01 00 00 sub esp,13Ch
004D1389 53 push ebx
004D138A 56 push esi
004D138B 57 push edi
004D138C 8D BD C4 FE FF FF lea edi,[ebp-13Ch]
004D1392 B9 4F 00 00 00 mov ecx,4Fh
004D1397 B8 CC CC CC CC mov eax,0CCCCCCCCh
004D139C F3 AB rep stos dword ptr es:[edi]
004D139E A1 00 70 4D 00 mov eax,dword ptr [___security_cookie (4D7000h)]
004D13A3 33 C5 xor eax,ebp
004D13A5 89 45 FC mov dword ptr [ebp-4],eax

似乎看不出什么名堂来,但是如果一旦我们把N改为更大的数字,例如100000,再来看看:

00FF1380 55                   push        ebp
00FF1381 8B EC mov ebp,esp
00FF1383 B8 78 87 01 00 mov eax,18778h
00FF1388 E8 30 FE FF FF call @ILT+440(__alloca_probe) (0FF11BDh)
00FF138D 53 push ebx
00FF138E 56 push esi
00FF138F 57 push edi
00FF1390 8D BD 88 78 FE FF lea edi,[ebp-18778h]
00FF1396 B9 DE 61 00 00 mov ecx,61DEh
00FF139B B8 CC CC CC CC mov eax,0CCCCCCCCh
00FF13A0 F3 AB rep stos dword ptr es:[edi]
00FF13A2 A1 00 70 FF 00 mov eax,dword ptr [___security_cookie (0FF7000h)]
00FF13A7 33 C5 xor eax,ebp
00FF13A9 89 45 FC mov dword ptr [ebp-4],eax

看第四行,有一个叫做 call @ILT+440(__alloca_probe)的一个东西,

汇编语言中,call指令后面跟的东西是一个函数,那么alloca_probe就是那个在栈中分配内存所使用到的函数。

我们由此得知,在栈中分配超过某个特定值的内存,就需要调用alloca函数。

(文章开头那本《30天自制操作系统》书中写的是4KB,但是我这里测试下来,似乎又不是4KB,这里暂时存疑)

3.手工调用alloca函数

我们这里尝试运行如下的代码:

#include "stdafx.h"
#include<stdio.h>
#include<iostream> int a;
int main(){
int b;
int *p=(int*)alloca(sizeof(int));
printf("%p %p %p ",&a,&b,p);
system("pause");
}

可以看出,输出的p的地址与b的地址更加相近。b写在main函数中,说明这是一个局部变量,或者叫做自动变量,它是保存在栈中的。由此,我们得知,alloca也是会分配在栈中。

4.注意事项

(1)alloca所分配的内存会被自动释放,不能free!!!

如果我们尝试使用free释放p的内存,在VS中,引发了一个运行错误。

(2)alloca的可移植性不高,因此我们一般不使用它。

在调用alloca()的函数返回的时候,它分配的内存会自动释放。也就是说,用alloca()分配的内存在某种程度上局部于函数的堆栈帧或上下文中。

alloca()不具可移植性,而且在没有传统堆栈的机器上很难实现。当它的返回值直接传入另一个函数时会带来问题, 如 fgets(alloca(100), 100, stdin)。

(3)由于C99开始引入了可变长数组VLA,可以使用这个功能来更好地完成alloca所需要的完成的任务。

【原创】浅谈指针(十一)alloca函数的更多相关文章

  1. 【原创】浅谈指针(十二)关于static(上)

    0.前言 这个系列基本上是一月一更到两月一更 今天写一篇关于static的,内含大量干货,做好准备 1.基础知识的回顾 1.1.内存的种类 一般来说,我们之前已经讲过的变量(或者说是内存)可以大体分为 ...

  2. [原创]浅谈如何使用gcc开发NT核心驱动程序

    原文链接:[原创]浅谈如何使用gcc开发NT核心驱动程序 一谈到在 Win NT 下开发核心驱动程序,可能不少人首先都会想到微软“正统”的VC来.诚然,用VC 配合 WINDDK 的确工作的不错,但或 ...

  3. [原创]浅谈移动互联网App兼容性测试

    [原创]浅谈移动互联网App兼容性测试 今天要谈的话题,估计各位测试都有感受,移动互联网App兼容性测试,我们到底测试覆盖如何去挑选机型?具体移动App兼容性测试如何开展?是不是应引进像testin这 ...

  4. [原创]浅谈IT人如何做理财规划

    [原创]浅谈IT人如何做理财规划 鱼哥博客上多数写的是技术和管理相关,但很少有理财等话题,今天抽空来谈谈IT人如何做理财规划,如果要想学习理财,我想很有名的“标准普尔家庭资产象限图”上值得每个学习和理 ...

  5. [原创]浅谈Web UI自动化测试

    [原创]浅谈Web UI自动化测试 Web UI自动化测试相信大家都不陌生,今天来谈谈这个,我最早接触自动化测试时大约是在2004年,2006年当时在腾讯财付通算是开始正式接触自动化测试,之所以是正式 ...

  6. [原创] 浅谈ETL系统架构如何测试?

    [原创] 浅谈ETL系统架构如何测试? 来新公司已入职3个月时间,由于公司所处于互联网基金行业,基金天然固有特点,基金业务复杂,基金数据信息众多,基金经理众多等,所以大家可想一下,基民要想赚钱真不容易 ...

  7. [原创]浅谈移动App安全测试

    [原创]浅谈移动App安全测试 移动互联网很火,就像当年互联网兴起一样,这几天和朋友在沟通交流,谈到一个话题,你们做金融App钱放在你们哪边安全不?会不会你们做的移动App不安全,让人盗了里面的资金, ...

  8. [原创]浅谈H5页面性能优化方法

    [原创]浅谈H5页面性能优化方法 前阶段公司H5页面性能测试,其中测试时也发现了一些性能瓶颈问题,接下来我们在来谈谈H5页面性能优化,仅仅是一些常用H5页面性能优化措施,其实和Web页面性能优化思路大 ...

  9. [原创]浅谈H5页面性能测试

    [原创]浅谈H5页面性能测试 H5页面我想各位都不陌生,随着移动互联网兴起,不管是App,还是H5都火起来了,最突出的2个表现是ios/android/前端等工程师薪水大涨,尤其是资深前端工程师40W ...

  10. [原创]浅谈H5页面测试介绍

    [原创]浅谈H5页面测试介绍 目前移动互联网非常火热,除了各种App,H5也是非常热,由于H5跨平台,且版本更新容易,做为引流或获客是非常好的一种简单低成本平台:今天来谈谈H5页面测试都要测试什么? ...

随机推荐

  1. Note -「多项式」基础模板(FFT/NTT/多模 NTT)光速入门

      进阶篇戳这里. 目录 何为「多项式」 基本概念 系数表示法 & 点值表示法 傅里叶(Fourier)变换 概述 前置知识 - 复数 单位根 快速傅里叶正变换(FFT) 快速傅里叶逆变换(I ...

  2. CentOS7+Rsyslog+MySQL 搭建 Rsyslog 日志服务器

    文章目录 1.主机环境 2.rsyslog搭建 2.1.rsyslog-server搭建 2.2.rsyslog-client 2.2.1.测试 2.3.rsyslog日志分类 2.3.1.测试 3. ...

  3. 《从零开始, 开发一个 Web Office 套件》系列博客目录

    这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等. 对应的Github r ...

  4. python-jsonpath模块

    前言 当遇到层级比较深的字典时,要想取值使用jsonpath取值比较方便,可以一下取到值, jsonPath用符号$表示最外层对象 基本语法 import jsonpath res=jsonpath. ...

  5. [c语言]左移和右移

    左移和右移都是位运算的概念.我们知道计算机是基于二进制保存数据的,因此左移和右移的概念十分重要.本文约定是32位的机器. [左移] 丢弃最高位,0补最低位 左移是把一个数按照二进制每位向左移动若干位, ...

  6. Spring Cloud Sleuth 和 Zipkin 进行分布式跟踪使用指南

    分布式跟踪允许您跟踪分布式系统中的请求.本文通过了解如何使用 Spring Cloud Sleuth 和 Zipkin 来做到这一点. 对于一个做所有事情的大型应用程序(我们通常将其称为单体应用程序) ...

  7. C语言字符串输入输出函数(gets()函数、puts()函数、fgets()函数、fputs()函数)

    scanf("%s", str) 不能读取空白字符,遇到第一个空白字符就停止读取. gets(str) 读取整行输入,直至遇到换行符,丢弃换行符储存其余字符,并在末尾添加 \0.与 ...

  8. 查询性能提升3倍!Apache Hudi 查询优化了解下?

    从 Hudi 0.10.0版本开始,我们很高兴推出在数据库领域中称为 Z-Order 和 Hilbert 空间填充曲线的高级数据布局优化技术的支持. 1. 背景 Amazon EMR 团队最近发表了一 ...

  9. JZ-042-和为 S 的两个数字

    和为 S 的两个数字 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 返回值描述: 对应每个测试案例,输出两 ...

  10. SQL Server的Linked Servers(链接)

    我们在使用SQL Server时,有时会有这种需求,需要从一个SQL Server服务器A中,查询另一个SQL Server服务器B中的表,然后将SQL Server服务器A中的表和SQL Serve ...