- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我前几天刚刚了解了 C calloc()
函数。阅读了它的描述以及它与 malloc
(1、2)的不同之处后,我认为作为非嵌入式程序员,我应该始终使用 calloc()
。但事实真的如此吗?
我有一个保留意见是访问 calloc()
内存的额外延迟,但我也想知道是否存在从 malloc()
切换到calloc()
会以更严重的方式破坏程序。
P. S. calloc()
的零初始化方面对我来说非常清楚。我有兴趣了解的是 calloc()
和 malloc()
之间的另一个区别 - calloc()
提供的惰性内存分配.如果您只关注内存初始化方面,请不要发布答案。
最佳答案
这确实是一个视情况而定的决定。经验法则是
如果您首先写入分配的内存,malloc()
更好(可能的开销更少)。
示例:考虑以下场景
char * pointer = NULL;
//allocation
strcpy(pointer, source);
在这里,使用malloc()
可以很好地进行分配。
如果有可能使用分配的内存进行先读后写,请使用 calloc()
,因为它会初始化内存。通过这种方式,您可以避免调用 undefined behavior 的单元化内存先读后写场景的问题。 .
例子:
char * pointer = NULL;
//allocation
strcat(pointer, source);
这里,strcat()
需要第一个参数已经是一个string,使用malloc()
分配不能保证这一点。由于 calloc()
对内存进行零初始化,它将在这里达到目的,因此,calloc()
是这种情况下的方法。
要详细说明第二种情况,请引用 C11
,第 7.24.3.1 章(关注我的重点)
The
strcat()
function appends a copy of the string pointed to bys2
(including the terminating null character) to the end of the string pointed to bys1
. The initial character ofs2
overwrites the null character at the end ofs1
. [....]
因此,在这种情况下,目标指针应该是指向字符串的指针。通过 calloc()
进行分配保证了使用 malloc()
进行分配时不能保证,正如我们从第 §7.22.3.4 章中所知
The
malloc
function allocates space for an object whose size is specified bysize
and whose value is indeterminate.
编辑:
建议使用 malloc()
而不是 calloc()
的一种可能情况是编写用于单元/集成测试的测试 stub 。在这种情况下,使用 calloc()
可以隐藏与后一种情况类似的潜在错误。
关于c++ - calloc 比 malloc 好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41263448/
这个问题已经有答案了: Do I cast the result of malloc? (29 个回答) 已关闭 8 年前。 有什么区别: int *array; array = (int*) cal
我是一名初学者 C 程序员,我认为情况会是这样,但如果可能的话,我希望得到一些肯定。 如果它们相同,为什么不只取一个参数呢? 最佳答案 calloc(a, b) 和 calloc(b, a) 之间没有
这个问题在这里已经有了答案: Is calloc(4, 6) the same as calloc(6, 4)? (7 个答案) 关闭 3 个月前。 calloc(10,4) 和 calloc(1,
所以calloc()通过向操作系统询问一些虚拟内存来工作。操作系统与 MMU 协同工作,并巧妙地以虚拟内存地址进行响应,该地址实际上映射到 copy-on-write, read-only page
在玩 hashmap 玩具示例的实现时(为了好玩)我发现了一个奇怪的行为,calloc 没有像预期的那样将我想要的整个内存块初始化为零。如果整个内存块都清零,则以下代码应该不会产生任何输出: #inc
我想创建一个封装动态分配数组的结构。它看起来像这样: typedef struct IntArray { int *field; size_t length; } IntArray;
我正在开发一个 C 项目,事实证明,在特定时刻,我调用了 calloc() 函数,它分配了一个已在使用中的内存块。这怎么可能?我检查了我的内存分配使用情况,每次调用 malloc/calloc 时,我
在我的程序中,calloc() 不适用于超过 38 的大小,但小于此数字则可以完美运行。在本例中,我想分配 128 个 int,然后释放它。 怎么了? #include #include #inc
我的main函数有这个: int main() { // double minW, minL, width, length; unsigned tileCap = 10; auto
首先,这是我见过的最奇怪的错误。我不知道发生了什么事。任何人都可以就正在发生的事情提供任何帮助,我们将不胜感激。 我正在编写一个 C 程序,该程序将文件读入动态分配的 block 并在这些 blo
calloc 是否分配返回连续的内存位置?如果是,如果不可用,它会做什么? 最佳答案 Does calloc allocate returns contiguous memory location?
这句话是什么意思? //allocated memory for Device info (*PppsCoreStructure)->psDeviceDetails=(sDeviceDetails *
这是我的代码: #include #include int main(){ int n=10; char *s= calloc(2,sizeof(char)); sprintf(s,"%d",n)
我在 Tiva C launchpad (ARM Cortex M4) 上分配内存时遇到问题,我想做的是在某个时候动态分配指向另一个结构内部结构的指针 calloc() 返回一个指针,该指针的值与存储
我是 C 的新手。 我知道这是正确的: char* Str; Str = (char*)calloc(Str_Len, sizeof(char)); ,但为什么这是不正确的? char* Str; *
我遇到了某种指针冲突, 基本上,在我做的一个函数中, a = calloc(1,28); // gives me 0x100100d10 然后很快在我做的一个子函数中, b = calloc(1,16
这是一段代码。N=70000 或更多时,代码会继续执行 STEP1 并因段错误而崩溃。相反,如果我把例如N=50000,calloc返回NULL,程序退出返回2。那么为什么 N=70000 callo
查看刚刚提出的这个问题:Inconveniences of pointers to static variables那么,这样做会被视为不良做法吗? char* strpart(char* strin
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Is NULL always zero in C? C 标准为 calloc() 规定了以下内容: The
清零内存有什么优势(即 calloc() 优于 malloc())?无论如何,您不会将值更改为其他值吗? 最佳答案 有两个阵营:一个说在声明变量时初始化变量有助于发现错误。这个阵营中的人确保他们声明的
我是一名优秀的程序员,十分优秀!