- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
为什么 calloc
接受两个参数而不是像 malloc
那样接受一个参数?
具体来说,由于以下表达式之间没有区别(或存在区别?):
calloc (a, b);
calloc (b, a);
calloc (a * b, 1);
calloc (1, a * b);
为什么不只接受要分配的字节总数?这个界面背后的基本原理是什么?为什么这不适用于 malloc?
最佳答案
关于为什么它有两个参数,我听到了两个 [互斥] 的解释:
calloc
负责检查乘法溢出。如果请求 block 的总大小太大(如溢出 size_t
),calloc
返回空指针以指示失败。使用 malloc
时,您必须自己观察溢出,而许多人只是忘记这样做。 (尽管标准库的历史知道忽略溢出的 calloc
实现示例,因此无法正常工作)。
calloc
实际上允许分配比 size_t
类型范围更大的内存块,即 calloc
可能能够执行其参数的适当的非溢出大乘法并分配结果大小的 block 。出于这个原因,由于 calloc
使用两个 size_t
类型的参数,它可以分配比 malloc
更大的 block (因为 >malloc
只接受一个 size_t
类型的参数。
我一直相信第一个解释是正确的。但是,在阅读了 SO 上的一些帖子后,我产生了疑问。
关于c - calloc 的两个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4083916/
这个问题已经有答案了: 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())?无论如何,您不会将值更改为其他值吗? 最佳答案 有两个阵营:一个说在声明变量时初始化变量有助于发现错误。这个阵营中的人确保他们声明的
我是一名优秀的程序员,十分优秀!