访问结构中的char指针的各个元素

时间:2015-07-20 01:03:58

标签: c pointers struct

我有一个定义为

的结构
typedef struct {
char *somechar;
} Random;

我实例化一个这样的结构 -

Random *r=(Random *)malloc(sizeof(Random));

如何逐个单独地将字符分配给somechar? 我已经

r->somechar+0='b';
r->somechar+1='a';

这并不起作用。

2 个答案:

答案 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) = ..

后者与您尝试的类似,但您需要使用取消引用*运算符来告诉编译器您要分配给地址指向的值。

请忘记您还需要通过调用somecharrfree(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);

这将在单个块中分配具有给定大小的数组的结构。