写入双const指针

时间:2017-09-05 23:09:02

标签: c pointers struct const

我想为教育实现自己的字符串实现。为此,我定义了一个名为string的结构,如下所示:

struct string {
    const char *const data;
    const int length;
};

我使用函数创建这些字符串结构,然后将它们分配给变量。

为了覆盖const int length,我使用以下技巧:

*(int *) &result.length = // a int

现在我也想写信给const char *const data。 据我所知,第一个const确保您无法编辑指针指向的项目,第二个const是您无法将指针指向不同的内存位置。这些是不可变字符串的属性。所以我的问题是:如何像const char *const data那样为const int length分配内容?

编辑:result如上所示是结构string

的一个实例

1 个答案:

答案 0 :(得分:1)

在声明中填写struct string初始化

还建议存储尺寸而不是长度并使用size_t

#include <stdio.h>
#include <stdlib.h>

struct string {
  const char * const data;
  const size_t size;
};

struct string string_copy(const char *src) {
  size_t size = strlen(src) + 1;
  char *copy = malloc(size);
  if (copy) {
    memcpy(copy, src, size);
  } else {
    size = 0;
  }

  struct string retval = {copy, size}; // ****
  return retval;

  // or return a compound literal (C99)
  return (struct string){ copy, size};
}

void string_free(struct string s) {
  free((void*)s.data);
}

int main(void) {
  struct string a = string_copy("Hello");
  printf("%zu <%s>\n", a.size, a.data);
  string_free(a); 
  // do not use `a` subsequently
  return 0;
}

我不建议使用struct string retval = {"World", 6};之类的字符串文字进行初始化,因为这会限制struct string的有用性。

使用不透明struct有许多优点@Jonathan Leffler超出此方法 - 主要是为了防止其他代码混淆struct string