C - 如何在 calloc 中使用自己的值(而不是 0)

标签 c initialization calloc

在 C 中我们使用 calloc 方法时;所有保留的内存将被初始化为 0 .

有没有办法用另一个值初始化它而不迭代所有值?
例如:

int* example = calloc(100,sizeof(int));

这将创建一个包含 100 个零的数组,但我希望这是(例如)100 个。

最佳答案

calloc多达memset不知道存储在分配块中的数据的结构。用memset其实没什么用与 0 不同的任何内容除了 char 的数组之外的其他东西类型。请注意 calloc功能 mallocmemset(..., 0) ,但在某些实现中可能要快得多。

按照标准,calloc不存储 0 ,但是 sets all bits zero .这不一定会导致 float 0.0或空指针常量,因为它们可能有其他二进制表示。然而,对于整数类型,0所有位都为零,所以 作品。

但仅限于0 ,因为在大多数(如果不是全部)现代平台上整数至少使用 2 个字节,所以如果您按字节设置,您将触及同一整数的不同字节。试试看 memset(..., 3) , 32 位 int你会读到0x03030303 , 64 位 0x0303030303030303 .

要设置已分配数组的结构化值,无法使用循环:

// here we use int, but that can also be float or a struct
int *a = malloc(sizeof(*a) * 5);
if ( a != NULL ) {
    for ( size_t i = 0 ; i < 5 ; i++)
        a[i] = 1;    // for a struct use a compound literal or set per field

    ...
    free(a);
}

首先,您不应该担心性能。上面的模式很可能被您的编译器识别,并被高度优化的代码取代,这些代码将与 memset 一样快(如果不是更快) (但不是 calloc )。

关于C - 如何在 calloc 中使用自己的值(而不是 0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33176361/

相关文章:

c - 为结构数组中的结构成员分配内存后写入无效

c - mq_timedreceive 报告 EAGAIN 错误且未设置 O_NONBLOCK

c - 寻找下一个最小的回文,无限循环

c++ - C++类:必须显式初始化成员

rust - 为什么将 `ptr::write` 与 `MaybeUninit` 的数组一起使用?

c - 二维数组动态内存分配崩溃

c - calloc 和 malloc 后跟 memset 有什么区别?

c - 在C中如何将一手5张牌中相同的2-3张牌匹配为一对?

c 中的客户端服务器 - 较大文件的文件传输问题

c++ - 非 POD 数组上的 std::fill_n 是否可以首次初始化?