如何不使用for循环初始化全为1的指定大小数组?
不用循环批量初始化全1数组的实用方案
在C语言里,替代手写for循环来批量初始化全1数组,得根据数组的类型(静态/全局、变长数组、动态分配)选择合适的方法,下面是几种常用的实现方式:
1. 静态/全局数组(编译期确定大小)
如果数组的大小是编译期常量,可以用C99引入的指定初始化器,一次性把所有元素设为1:
#include <stdio.h> #define ARRAY_SIZE 100 int main() { int array[ARRAY_SIZE] = {[0 ... ARRAY_SIZE-1] = 1}; // 后续数组操作 }
注意:这种写法需要C99及以上标准支持,且数组大小必须是编译时就能确定的常量,不能是运行时变量。
2. 动态分配的数组
如果是用malloc动态分配的数组,别用memset——它是按字节赋值的,会把int的每个字节都设为0x01,最终得到的int值是0x01010101(假设4字节int),不是我们要的1。可以用以下两种方式:
方式一:编译器内置批量赋值函数(GCC/Clang)
GCC和Clang提供了__builtin_memset_patternN系列函数,可以按指定大小的模式批量赋值,比如针对4字节int的__builtin_memset_pattern4:
#include <stdio.h> #include <stdlib.h> int main() { int size = 100; int *array = malloc(size * sizeof(int)); if (!array) { // 处理内存分配失败 return 1; } // 批量设置每个int元素为1 __builtin_memset_pattern4(array, &(int){1}, size * sizeof(int)); // 使用数组... free(array); }
方式二:MSVC平台专用指令
如果是在MSVC环境下,可以用__stosd intrinsic函数,直接通过汇编指令批量写入32位整数:
#include <stdio.h> #include <intrin.h> #include <stdlib.h> int main() { int size = 100; int *array = malloc(size * sizeof(int)); if (!array) { return 1; } // 把值1重复写入size个int元素 __stosd((unsigned int*)array, 1, size); // 使用数组... free(array); }
3. 变长数组(VLA,运行时确定大小)
像你例子里的int array[size];(size是运行时变量),编译期初始化的方法用不了。如果不想手写循环,可以用上面提到的编译器内置函数,比如GCC下:
#include <stdio.h> int main() { int size = 100; int array[size]; __builtin_memset_pattern4(array, &(int){1}, size * sizeof(int)); // 后续数组操作 }
额外提醒
如果追求跨编译器的完全兼容性,其实没有标准的“无循环”方法——C标准库只提供了按字节赋值的memset,没有通用的批量赋值任意整数的函数。这种情况下,手写for循环反而最靠谱,而且现代编译器会自动把这类简单循环优化成SIMD批量操作,性能和所谓的“矢量方式”完全一致。
内容的提问来源于stack exchange,提问作者3sm1r
相关产品推荐
相关产品推荐

