如何在 C 中对 malloc() 数组进行一行分配?

haz*_*ard 8 c arrays heap-memory

在 CI 中可以像这样初始化堆栈上的数组:

SOME_DATA_TYPE* x = (SOME_DATA_TYPE[5]) {v1, v2, v3, v4, v5};
Run Code Online (Sandbox Code Playgroud)

是否有类似的单行方法将值分配给malloc()堆上的-ed 数组?

SOME_DATA_TYPE* y = malloc(sizeof(SOME_DATA_TYPE)*5);  
// what comes here?  
Run Code Online (Sandbox Code Playgroud)

或者我是否必须遍历数组并单独分配值?

chu*_*ica 7

关于“初始化”结果的第一个问题malloc()是分配可能会失败。这里y初始化为一些指针值。引用的数据仍然不确定。

#define  element_count  5
SOME_DATA_TYPE *y = malloc(sizeof *y * element_count);
if (y == NULL) Handle_OutOfMemory();
Run Code Online (Sandbox Code Playgroud)

使用 C11,代码可以使用复合文字来设置,而不是初始化,指向的数据y

memcpy(y, (SOME_DATA_TYPE[element_count]) {v1, v2, v3, v4, v5}, sizeof *y * element_count);
Run Code Online (Sandbox Code Playgroud)

使用不检查分配的直接单行程序不是健壮的编程。

// one-liner, but not robust code
SOME_DATA_TYPE *y = memcpy(malloc(sizeof *y * element_count), 
    (SOME_DATA_TYPE[element_count]) {v1, v2, v3, v4, v5}, sizeof *y * element_count);
Run Code Online (Sandbox Code Playgroud)

注意代码使用sizeof *pointer_variable * element_count而不是sizeof (pointer_variable_dereferenced_type) * element_count因为更容易编码、更不容易出错、更容易审查和维护。任何一种方法都会奏效。