在c中初始化动态数组

Intializing dynamic arrays in c

我使用 malloc 创建了一个动态数组,在初始化它时出现错误。我在这里做错了什么?

float* data_input = malloc(4 * sizeof(float));
data_input = {1.2, 2.4, 3.2, 4.5};

错误:

model.c: In function ‘main’:
model.c:9:18: error: expected expression before ‘{’ token
    9 |     data_input = {1.2, 2.4, 3.2, 4.5};

这个赋值语句

data_input = {1.2, 2.4, 3.2, 4.5};

在 C 中不正确。

你可以这样写

#include <stdlib.h>
#include <string.h>

//...

float* data_input = malloc(4 * sizeof(float));
memcpy( data_input, ( float [] ){1.2, 2.4, 3.2, 4.5 }, sizeof( float[4] ) );

这是一个演示程序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) 
{
    enum { N = 4 };
    
    float *data_input = malloc( N * sizeof( float ) );
    memcpy( data_input, ( float [] ){1.2, 2.4, 3.2, 4.5 }, sizeof( float[N] ) );
    
    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%.1f ", data_input[i] );
    }
    
    putchar( '\n' );
    
    free( data_input );

    
    return 0;
}

程序输出为

1.2 2.4 3.2 4.5 

C 中没有 {1.2, 2.4, 3.2, 4.5} 表示数组的语法。

在初始化中,{1.2, 2.4, 3.2, 4.5} 表示可用于初始化数组元素的初始化器列表。

float *data_input = malloc(4 * sizeof *data_input);之后(并检查malloc的return值不是空指针),可以通过单独初始化每个元素来初始化数组:

data_input[0] = 1.2;
data_input[1] = 2.4;
data_input[2] = 3.2;
data_input[3] = 4.5;

或者您可以从复合文字复制数组:

memcpy(data_input, (float []) {1.2, 2.4, 3.2, 4.5}, 4 * sizeof *data_input);

可以使用

float* data_input = malloc(4 * sizeof (float) );
memcpy( data_input, ( float [] ){1.2, 2.4, 3.2, 4.5 }, sizeof( float[4] ) );

但它有一个缺点。代码重复。相反,您可以这样做:

float* data_input = malloc(4 * sizeof *data_input);
float tmp[] = { 1.2, 2.4, 3.2, 4.5 };
memcpy( data_input, tmp , sizeof tmp );

甚至

float tmp[] = { 1.2, 2.4, 3.2, 4.5 };
size_t size = sizeof tmp/sizeof tmp[0];
float* data_input = malloc(size * sizeof *data_input);
memcpy( data_input, tmp , sizeof tmp );

请注意,从 sizeof (float) 更改为 sizeof *data_input 也是为了避免重复。