Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >malloc像calloc一样工作。

malloc像calloc一样工作。
EN

Stack Overflow用户
提问于 2020-10-19 11:35:05
回答 2查看 147关注 0票数 0

当malloc运行时,它生成内存块,它不设置任何值,并且包含垃圾值。在calloc运行时,会发生一些类似malloc函数的事件,但有一个不同之处。当calloc生成新块时,它会在块中设置0(Zero)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
int main(void){
    int i,j;
    int* array1 = (int*)malloc(sizeof(int)*5);
    int* array2 = (int*)calloc(sizeof(int),5);
    for(i = 0; i < 5; i++){
        printf("%p: %d\n",&array1[i],array1[i]);
    }
    printf("===================\n");
    for(j = 0; j < 5; j++){
        printf("%p: %d\n",&array2[j],array2[j]);
    }
    return 0;
}

根据这些信息,前五个值必须包含垃圾值(实际上它应该看起来像随机数据),第二个值必须是零。然而,当这段代码在Windows中运行时,没有问题,但是当这段代码在Linux中运行时,这种情况就不会发生了。我认为它依赖于ASLR或DEP保护,我关闭了ASLR,我使用旧的Linux系统进行DEP保护,但结果是一样的。最后,我认为它可能依赖于C标准,我在编译代码时更改了C标准,但结果并没有不同。我要问的是什么原因。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-20 01:43:58

malloc的行为是,它返回未初始化的内存。从未初始化的内存读取是未定义的行为,这意味着任何事情都可能发生;而一个足够聪明的编译器检测到,您正在从未初始化的内存读取,甚至可能优化读取并替换为常量值,甚至终止您的程序。

也就是说,您读取的是零,而不是存储在内存中的任何部分的剩馀值,这是出于安全考虑。几年前,它的行为实际上是这样的。但后来人们意识到,这可能会泄露密钥或其他秘密,从而改变了Linux‘(和*BSD)内核的行为,以便在第一次将内存页映射到进程时将其归零。对于Linux,这种行为是在Linux-2.6.33中引入的。赛瑟尔 ( malloc/calloc分配程序内部用于与内核对话的内容)获得了一个新标志:

MAP_UNINITIALIZED (自从Linux2.6.33之后) 不要清除匿名页面。此标志旨在提高嵌入式设备的性能。只有当内核配置了CONFIG_MMAP_ALLOW_UNINITIALIZED选项时,才会使用此标志。由于安全问题,该选项通常只在嵌入式设备(即对用户内存内容有完全控制的设备)上启用。

票数 2
EN

Stack Overflow用户

发布于 2020-10-19 11:46:30

malloc不使用零填充数据(正如您预期的那样)。但不能保证垃圾数据不是零。所以,如果您分配内存,并看到所有字段有时或在某些情况下为零,这是可以的。我假设您将看到“更多的随机”数据在“错位”内存中,如果大小要大得多,或者如果您要分配,填充smth,空闲,再分配。但是使用calloc,即使在这样的操作之后,您仍然会看到零内存。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64434057

复制
相关文章
malloc、calloc、realloc
malloc 函数原型 void *malloc(size_t size); //向系统申请分配指定size个字节的内存空间,size是一个无符号数 //返回类型为void*,表示不确定返回类型的指针。也就是说,返回 类型的指针可以被强制转换成任意类型的指针。 头文件 #include<malloc.h>或者 #include<stdlib.h> calloc 函数原型 void *calloc(size_t n, size_t size); //在内存的动态存储区域区中分配n个长度为size的连续
青木
2018/05/28
1.1K0
malloc与calloc
在gcc编译器中malloc与calloc它们都是实现内存分配。但是也有点小区别,就是malloc分配内存不会将数据清零,而calloc则会将数据清零。 源码 bzero(ptr,nelem*elsize)是将ptr的前nelem * elsize个字节置为0。 gcc-4.7.1 calloc函数源代码 /* calloc -- allocate memory which has been initialized to zero. This function is in the public dom
Qt君
2019/07/15
1.2K0
malloc 和 calloc 的区别
calloc 会申请内存,并全初始化为 0;而 malloc 只申请内存,并不作初始化。
ClearSeve
2022/02/10
2.2K0
C 语言中的 malloc,free,calloc,realloc
malloc函数 原型:extern void* malloc(unsigned int size); 功能:动态分配内存; 注意:size 仅仅为申请内存字节大小,与申请内存块中存储的数据类型无关,故编程时需要通过以下方式给出:长度 * sizeof(数据类型); 示例: //动态分配内存,输入5个数据,并把低于60的值打印出来 #include <stdio.h> #include <stdlib.h> int main() { int *ptr = (int *)ma
村雨遥
2022/06/15
4480
让R像excel一样工作
The package tidyverse includes several useful packages using in data analysis,
ruochen
2021/11/26
8600
malloc calloc-【请问】为什么calloc要两个参数而malloc只要一个参数就可以了?
memory blocks。void *malloc( size_t size ); Header malloc and ANSI, Win 95, Win NT For , see in the 。。LIB Single thread static ,retail LIBCMT。LIB staticmalloc calloc, retail MSVCRT。LIB Import for MSVCRT。DLL, retail Return a void to the space, or NULL if there is memory 。 To return a to a type other than void, use a type cast on the return value。
宜轩
2022/12/26
2680
【C】动态内存管理 malloc calloc relloc free 函数详解
但是上述的开辟空间的方式有两个特点: 1. 空间开辟大小是固定的。 2. 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。
阿伟@t
2023/10/10
3270
【C】动态内存管理 malloc calloc relloc free 函数详解
【熟视C语言】C语言动态内存管理(malloc,calloc,realloc,free)
这样的空间开辟方式,在后续操作中,是无法改变以上数据所占空间大小的,并且对于数组来说,开辟空间是必须指明数组长度的。而在我们实际生活中又确实会出现一组数据量会随时变化的数据组。这时我们就需要使用动态内存函数来为数组,变量来开辟空间。
Crrrush
2023/06/23
1990
【熟视C语言】C语言动态内存管理(malloc,calloc,realloc,free)
C语言动态内存分配函数malloc(),calloc(),realloc()用法对比分析
特点: 所开辟的内存是在栈中开辟的固定大小的 ,如a是4字节 ,数组b是40字节 ,并且数组在申明时必须指定其长度 , 如果是全局数组的话,内存是在编译时分配好的,如果是局部变量数组的话,运行时在栈上静态分配内存。
CtrlX
2022/10/04
1.4K0
C语言动态内存分配函数malloc(),calloc(),realloc()用法对比分析
【动态内存管理】malloc&calloc和realloc和笔试题和柔性数组
但是如果我们所需要的空间大小在程序编译时并不确定,而是到程序运行起来的时候才能知道,那上述的空间开辟的方式就不适合了,动态内存管理就应运而生。
MicroFrank
2023/01/16
5050
像高手一样行动
像高手一样行动 原则1 盯住你想成为的那个人 我们每个人的面前都有一个『超级偶像』,点燃你内心激情的关键之一在于用你对未来生活的憧憬去充裕你的『超级偶像』的形象,并且每天不断回放这些画面 原则2 每天花15分钟『铭刻』技能 有效铭记的关键在于创造一层强烈的连接关系:通过密集的观察和聆听,你可以想象自己掌握这项技能时的感觉。涉及身体技能时,把你自己投射到表演者的体内,你要对动作、节奏保持高度敏感,试着去感受这些动作的内部形状。涉及思维技能时,你可以通过重塑专家的决策模式来模拟这些技能。 棋手们通过一步一步地复
yeedomliu
2021/07/19
5720
人工神经网络真的像神经元一样工作吗?
人工神经网络和机器学习已经成为大众媒体的热门主题。智能机器这一想法勾起了很多人的想象,而且人们特别喜欢把它和人类放一起比较。特别是有一个关于人工智能的底层机制的基础问题经常出现——这些人工神经网络的工作方式真的和我们大脑中的神经元相似吗?
崔庆才
2019/09/04
1.2K0
人工神经网络真的像神经元一样工作吗?
决策树:一种像人脑一样工作的算法
决策树是用于机器学习最流行的算法之一,尤其对于分类和回归问题。我们每次做决策时大脑都像决策树一样工作。
AI研习社
2018/10/24
6400
决策树:一种像人脑一样工作的算法
【Wolfram|Alpha Notebook Edition】像W|A一样简单易用,像Mathematica一样强大
Wolfram|Alpha 在学生群体中深受欢迎,是很多在校大学生和高中生探索未知的一大法宝。通常,学生每输入一个问题,Wolfram|Alpha 给出一个(通常具有丰富情境化的)答案。这是个一问一答的过程,能解决很多实际问题,尤其是当与它的分步求解功能相结合的时候。
WolframChina
2019/11/21
1.9K0
【Wolfram|Alpha Notebook Edition】像W|A一样简单易用,像Mathematica一样强大
像TransactionScope一样使用DbTransaction
System.Transactions.TransactionScope为了提供一种非常方便的实现分布式事务的方式,但是在某些情况下为了阻止本地事务向分布式事务提升,我们只能通过DbTransaction进行事务控制。在进行数据库操作的时候,我们经常会遇到这样的事务场景:当某个方法单独执行的时候,它应该在一个单一的DbTransaction中执行;当多个方法一起执行的时候,它们应用共同在DbTransaction中执行。在本篇文章中我们通过对DbTransaction进行封装,提供一种类似于Transact
蒋金楠
2018/01/15
1.6K0
像对象一样对待数据
咱们编程教室有不少同学,学完了基础课程,掌握了一定的编程能力,开始做项目了。然后很可能遇到一个问题:管理数据。课程里有讲过用文件保存数据,还有 pickle、csv 等模块辅助。但对于稍微复杂一点的数据,往往不够方便。成熟的解决方案就是使用数据库。
Crossin先生
2018/07/24
7250
像对象一样对待数据
[转自blueidea]像table一样布局div Ⅰ
翻译自:Equal height boxes with CSS 原文:http://www.456bereastreet.com/archive/200405/equal_height_boxes_with_css/ 下面是我翻译的内容,是根据我对文章的理解意译的,你就别挑哪里翻译的不对了,我的目的只是传达这个CSS技巧 许多网页设计师都喜欢,将两个或者多个容器等高的并排放置,并在里面展示每个容器的内容,就象经典表格布局中的单元格控制几个栏目的位置,也喜欢容器的内容居中或顶部对齐显示。 但是你又不喜欢用
菩提树下的杨过
2018/01/22
1.4K0
像机器一样思考|TW洞见
今日洞见 文章作者、部分图片来自ThoughtWorks:仝键。 本文所有内容,包括文字、图片和音视频资料,版权均属ThoughtWorks公司所有,任何媒体、网站或个人未经本网协议授权不得转载、链接
ThoughtWorks
2018/04/20
9930
像机器一样思考|TW洞见
像学习vue 一样学习 react
一直听说 vue 借鉴了其他两大框架的优点,真实情况我并不了解,因为我只会 vue,才入坑 react。可能是语言都是想通的,react 没有我想象中那么高攀不起。
sunseekers
2019/01/28
1.1K0
像学习vue 一样学习 react
像Python一样玩C/C++
xeus-cling 是一个用于C++的Jupyter内核,基于C++解释器和Jupyter协议xeus的原生实现。
公众号guangcity
2019/12/29
3K0

相似问题

calloc问题- malloc.c:2385错误- calloc/malloc是如何工作的?

10

malloc + strcpy功能和calloc一样好吗?

33

Malloc或calloc

30

malloc和calloc

71

malloc和calloc

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文