我有一个定义为
的结构typedef struct {
char *somechar;
} Random;
我实例化一个这样的结构 -
Random *r=(Random *)malloc(sizeof(Random));
如何逐个单独地将字符分配给somechar? 我已经
了r->somechar+0='b';
r->somechar+1='a';
这并不起作用。
答案 0 :(得分:3)
首先,您需要分配char* somechar
指向的数据:您正在为包含指针的struct
分配空间,而不是指向数据。您需要单独分配
Random *r = malloc(sizeof(Random));
r->somechar = malloc(20); // allocate space for 20 characters
请注意,您不需要转换malloc
的结果,因为在C void*
中可以隐式转换为任何其他指针类型。此外,您必须确保malloc
返回的值是有效地址(因此它是!= NULL
),以确保堆分配不会失败。
最后要访问char*
的各个元素,您有两个选择:
r->somechar[1] = ..
*(r->somechar+1) = ..
后者与您尝试的类似,但您需要使用取消引用*
运算符来告诉编译器您要分配给地址指向的值。
请忘记您还需要通过调用somechar
和r
为free(r->somechar)
和free(r)
释放内存。
答案 1 :(得分:2)
typedef struct {
char *somechar;
} Random;
首先需要分配结构本身:
Random *r = malloc(sizeof(*r));
然后数组somechar
必须指向。如果你取消引用它,如果没有这个,它将被取消初始化,调用未定义的行为。
r->somechar = malloc(MAX_ARRAY_LENGTH);
必须将 MAX_ARRAY_LENGTH
设置为最大值。要存储到char
数组中的条目数。由于sizeof(char)
由标准定义为1
,因此无需明确指定。
请注意,您不应该投放void *
&返回的malloc
。朋友。无论谁告诉你,都应该阅读here。
<强>注意:强>
malloc
可能会失败,返回空指针。解除引用这种情况是未定义的行为并且可能使您的程序崩溃 - 如果您运气好的话(如果没有,您将不会注意到任何事情,但会出现奇怪的行为 - 例如nasal demons)。char
数组中存储C字符串,请考虑尾随'\'
malloc
内存均未初始化。如果您想要归零内存,请使用calloc
。free
都分配了块!使用相反的分配顺序。如果使用C99或C11(最新标准),您可以使用灵活的阵列成员并避免第二次分配:
typedef struct {
char somechar[]; // must be last member of the struct
} Random;
...
Random *r = malloc(sizeof(*r) + MAX_ARRAY_LENGTH);
这将在单个块中分配具有给定大小的数组的结构。