【问题标题】:Write to double const pointer写入双 const 指针
【发布时间】:2017-09-05 23:09:02
【问题描述】:

我想实现我自己的用于教育的字符串实现。为此,我定义了一个名为 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 int length 一样给const char *const data 分配一些东西?

编辑:result 如上图是结构体string的一个实例

【问题讨论】:

  • 等等。你为什么要把所有成员都设为const,然后违反他们的常量?
  • 为什么不把类型设置为不透明的,这样用户就无法深入到结构内部,因此除了使用您提供的访问功能外无法修改它。当您添加这么多 const 限定符时,您会使结构不可修改,从而导致您不得不就 SO 提出问题的可怕后果。你做的不好;你滥用演员表来让它发挥作用的事实表明你做的不好。
  • 你可以用struct string myString = { "this is my string", strlen("this is my string") };初始化你的结构然后你将无法修改它,这就是const的重点...
  • *(int *) &result.length = // a int 这不是“诡计”,这是可憎的
  • 鉴于*(int *) &result.length = 14;“有效”,*(char **)&result.data = "Do not do this"; 也应该如此。这是不可救药的讨厌,但它应该工作。

标签: c pointers struct constants


【解决方案1】:

在其声明处形成struct string初始化它。

还建议存储 size 而不是 length 并使用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 混淆。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    相关资源
    最近更新 更多