我有这样的结构:
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
设置为零。
答案 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);
}
您可以使用宏“自动执行此操作”