首页 > 解决方案 > 如何将内存分配初始化为 1s?

问题描述

a = (int*)malloc(sizeof(int)*N); 
b = (int*)malloc(sizeof(int)*N);

如果我分配了一些内存,如何将 a 和 b 都初始化为 1?

标签: ccudagpu

解决方案


不幸的是,没有标准的方法可以在不使用循环的情况下将内存块(非字节大小的数据)初始化为除全零之外的任何内容。(对于全零,您可以使用该calloc函数;对于单字节值块,您可以使用'memset()'

在您的情况下,由于两个块的大小相同,并且您希望将两者初始化为相同的值,您可以使用一个简单的单行循环:

a = malloc(sizeof(int)*N); // No need to cast the return value of malloc!
b = malloc(sizeof(int)*N);
// Initialize:
for (int i = 0; i < N; ++i) a[i] = b[i] = 1;

您可能会考虑使用各种“技巧”来优化for循环,但这种做法是有风险的、特定于平台的 hack,并且在执行速度方面通常收效甚微。此外,大多数现代编译器都会忽略该循环,使用循环展开、矢量化和特定于 CPU 的内在函数等技术(MSVC例如,生成代码以使用值为 的 64 位整数0x0000000100000001来减少循环一半)。


关于不转换结果malloc,请参阅:我是否转换了 malloc 的结果?


推荐阅读