声明一个零值而不是随机内存的结构?

时间:2010-09-24 11:00:28

标签: c

我有这样的结构:

typedef struct string {
 unsigned long length;
 unsigned *data;
} string;

我可以写一些东西,这样当我这样做时:

string s;

length属性为零,而不是发生在内存中的任何内容? data效果很好,因为它预设为零或空指针。

现在发生的事情的例子:

string s;
printf("length:  %lu\n", s.length);
printf("pointer: %lu\n", (unsigned long) s.data);

结果:

length:  140737488347584
pointer: 0

我想避免为每个新字符串调用初始化函数,只是为了将length设置为零。

更多信息

现在我考虑一下,在我的特定情况下可能没有必要这样做(虽然它会很好),因为大多数人最初会设置字符串ctou(导入UTF-8)来自char指针)并且该函数无论如何都将length设置为零。

4 个答案:

答案 0 :(得分:4)

您可以使用

string s = {0,NULL};

答案 1 :(得分:1)

要结合前两个答案(某种程度),我会定义类似

的内容
#define STRING_INITIALIZER {0, NULL}
.
.
string s = STRING_INITIALIZER;

顺便说一下,你的struct声明对于字符串看起来很奇怪。这不是一个字符串,因为我们通常在C中理解它,而只是unsigned的动态数组,或者它实际上是一个字符串,然后它应该是char*

答案 2 :(得分:1)

接受的答案回答了你提出的问题,但没有说明你是否应该这样做。

您的字符串是一个类,并具有类语义。初始化程序可能适用于每个最后一条指令都很重要的内核代码,但在应用程序代码中,静态初始化程序很难看并且容易出错。

可以用C编写类,stdio FILE类型是一个很棒的例子,这里有一个适用于你的字符串类的想法:

typedef struct {
  int length;
  char *data;
} String;

String *sopen() {
  String *s = malloc(sizeof(String));
  if(s) {
    s->length = 0;
    s->data = NULL;
  }
  return s;
}

int sclose(String *s) {
  free(s->data);
  free(s);
  return 0;
}

int main()
{
   String *s = sopen();
   return sclose(s);
}

出于隐喻原因,我遵循FILE*函数名称样式。是的,还有更多代码。是的,你必须明确地解除分配结构;但请注意,即使您在代码示例中依赖auto类初始化,如果曾分配data,您也不能指望为您自动释放存储空间。

这种方法还具有从类的用户中抽象出data类型的优点。由于对您真正想要使用的类型似乎存在一些混淆,这种灵活性可能会派上用场。

答案 3 :(得分:0)

#define DEFINE_STRING(s) string s = {0, NULL}

{
    DEFINE_STRING(s);
}

您可以使用宏“自动执行此操作”