我知道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};
答案 0 :(得分:2)
任何人都可以解释上面的代码是如何工作的吗?
与下面的代码相同:
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);
答案 1 :(得分:2)
但有人可以解释上述代码的工作原理吗?
我可以解释的含义。
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
s的特定大小数组的指针,但是 - 我知道我&# 39;在这里迂腐 - 这些都不是"指向几个整数的指针"。
在这种情况下看起来你想要的是一个数组,而不是(直接)一个指针。您可以初始化一个数组并在一个声明中设置它的大小,如下所示:
int array[] = {1, 2, 3, 4, 5};
之后,您可以在大多数方面使用array
,就像它是指向数组中第一个int
的指针一样。
但请注意,与结构不同,无法分配整个数组。虽然上面的代码可能看起来像包含一个赋值,但它没有 - 它包含一个初始化程序。虽然语法类似,但初始化程序不是赋值。后者是可执行的陈述;前者不是。
答案 2 :(得分:0)
最好有一个功能(或宏,如果你进入那些):
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);
答案 3 :(得分:0)
(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;