我知道malloc()
返回指向初始化内存块的指针,但初始化此内存对我来说很困难。
struct state{
int one;
int two;
};
struct state *one = malloc(sizeof(struct state));
*one = (struct state){.one = 10,.two = 20};
free(one);
我知道可以完成上述操作来初始化结构的一组值,而无需单独访问字段并手动更改值。但是谁能解释一下上面的代码是如何工作的?
另外,我如何为指向多个整数的指针执行此操作。下面的代码似乎不起作用:
int *pointer = (int*) {1,2,3,4,5};
与谁能解释一下上面的代码是如何工作的?
以下代码的工作方式相同:
int *one = malloc(sizeof(int));
*one = 1020;
free(one);
唯一的区别是,代码不是分配数值,而是分配struct
的值,通过struct
聚合表示。其他一切都是一样的:赋值将一个内存区域的内容复制到另一个内存区域。
另外,对于指向多个
int
的指针,我该如何执行此操作?
使用 memcpy
,如下所示:
int *pointer = malloc(5*sizeof(int));
static int data[] {1, 2, 3, 4, 5};
memcpy(pointer, data, sizeof(data));
free(pointer);
但是谁能解释一下上面的代码是如何工作的?
我可以解释它的含义。
struct state{ int one; int two; };
这声明了一个带有标签state
的结构类型,之后可以通过类型名称struct state
引用。
struct state *one = malloc(sizeof(struct state));
这会将one
声明为指向类型 struct state
的对象的指针。 假设malloc()
成功,它会初始化one
,以指向一个动态分配的、未初始化的内存块,其大小与struct state
完全相同,并以适合该(或任何其他(类型的对象的方式对齐。
*one = (struct state){.one = 10,.two = 20};
该表达式的右侧是类型 struct state
的复合文字。 大括号内的部分是其初始化列表,就像您可能用于初始化相同类型的普通变量一样:
struct state two = { .one = 10, .two = 20 };
.one
和.two
名称由每个单独的初始值设定项初始化的成员;在此特定情况下,它们是可选的,因为如果没有它们,初始值设定项表达式将按照成员在结构类型声明中出现的顺序与结构成员匹配。 总体而言,该语句将文本结构的值复制到 one
指向的对象。
free(one);
这将释放动态内存块。
另外,我该如何为指向多个整数的指针执行此操作[?
没有指向几个int
的指针这样的东西。 有一个指向一个int
的指针,或者一个指向特定大小的int
数组的指针,但是 - 我知道我在这里很迂腐 - 这两个都不是"指向几个整数的指针"。
在这种情况下,看起来您想要的是一个数组,而不是(直接(指针。 您可以初始化数组并在一个声明中设置其大小,如下所示:
int array[] = {1, 2, 3, 4, 5};
之后,您可以在大多数方面使用 array
,就好像它是指向数组中第一个int
的指针一样。
但请注意,与结构不同,不能将整个数组分配给。 虽然上面的代码可能看起来像它包含一个赋值,但它没有 - 它包含一个初始值设定项。 尽管语法相似,但初始值设定项不是赋值项。 后者是可执行语句;前者不是。
(struct state){.one = 10,.two = 20};
是一个复合文字。它是一个在块范围结束之前一直有效的对象。
*one = (struct state){.one = 10,.two = 20};
相当于
struct state temp = {.one = 10,.two = 20};
*one = temp;
在第二个示例中,复合文本的定义是错误的,您必须指定数组类型,然后像平常一样指向指针:
int *pointer = (int[]) {1,2,3,4,5};
同样,这相当于:
int temp[] = {1,2,3,4,5} ;
int *pointer = temp;
最好有一个函数(如果你喜欢这些函数,或者宏(:
struct state{
int one;
int two;
};
struct state* alloc_state(int one, int two)
{
struct state s = {one, two}; // order is per struct definition!
struct state* p = malloc(sizeof(struct state));
memcpy(p, &s, sizeof(s));
return p;
}
无论使用多少参数,此函数将始终保持 4 行代码。相同的原理可以用于其他类型。
宏版本:
#define ALLOC_STATE(p, ...)
{
struct state s = {__VA_ARGS__};
p = malloc(sizeof(struct state));
memcpy(p, &s, sizeof(s));
}
用法:
struct state* p;
ALLOC_STATE(p, 3, 4);