c - 如何将内存分配初始化为 1s?
问题描述
a = (int*)malloc(sizeof(int)*N);
b = (int*)malloc(sizeof(int)*N);
如果我分配了一些内存,如何将 a 和 b 都初始化为 1?
解决方案
不幸的是,没有标准的方法可以在不使用循环的情况下将内存块(非字节大小的数据)初始化为除全零之外的任何内容。(对于全零,您可以使用该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 的结果?
推荐阅读
- python - 在不使用枚举的情况下计算文件中的行数
- javascript - 仅在分派时在 Vuex Action 中加载包
- javascript - 如何在数组中呈现当前日期?
- php - 将应用程序部署到共享主机时未加载资产
- api - 在.Net Core API中上传具有属性的多个文件作为子对象并在Swagger中进行测试
- android - RecyclerView 仅在按下图标后显示
- sql-server - BCP 错误“无法打开 BCP 格式文件”
- eclipse - XML-api.jar 和 org.xml.sax 类与 JAVA 11 有问题
- xpath - xpath:根据父节点的类型过滤选定的节点
- c - 如何扫描序列