代码之家  ›  专栏  ›  技术社区  ›  Delan Azabani

用零值而不是随机内存声明结构?

c
  •  0
  • Delan Azabani  · 技术社区  · 14 年前

    我有这样一个结构:

    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
    

    我想避免在每个新字符串上调用初始化函数来设置 长度 归零。

    现在我想了想,在我的特殊情况下,可能真的没有必要这样做(尽管这样做会很好),因为大多数人最初都会设置字符串 ctou (从char指针导入UTF-8)和该函数集 长度 还是归零。

    4 回复  |  直到 14 年前
        1
  •  4
  •   SmacL    14 年前

    你可以用

    string s = {0,NULL};
    
        2
  •  1
  •   Jens Gustedt    14 年前

    为了结合前面的两个答案(某种程度上),我将定义如下

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

    顺便说一句,你的 struct 声明本身看起来很奇怪 一串 . 或者这不是我们通常在C中理解的字符串,而只是一个动态数组 unsigned ,或者它实际上是一个字符串 char* .

        3
  •  1
  •   msw    14 年前

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

    用C语言编写类是可能的 FILE type是一个极好的例子,下面是应用于string类的相同思想:

    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 一旦被分配,您就不能指望离开作用域为您自动取消分配存储。

    这种方法还具有抽象 数据

        4
  •  0
  •   Nicolas Viennot    14 年前
    #define DEFINE_STRING(s) string s = {0, NULL}
    
    {
        DEFINE_STRING(s);
    }
    

    可以使用宏“自动执行”