在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
也是为了避免重复。
我使用 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
也是为了避免重复。