c - 写入双常量指针

标签 c pointers struct constants

我想为教育实现自己的字符串实现。为此,我定义了一个名为 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 如上所示是struct string

的一个实例

最佳答案

形成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 .

关于c - 写入双常量指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46064521/

相关文章:

c - 反序列化错误

c++ - 如何同时编辑函数签名

c++ - 在 OS X Mavericks 中从 C++ 链接 C

c - 在此片段中,内存分配有帮助吗?我认为它被 *tmpl 覆盖了?

c++ - 使用指针成员变量重载类中的 + 运算符

json.Marshal 对两个对象的行为不同 (Go/Golang)

c - 如何分配这些结构?

在 C 中将无符号长整型转换为二进制

c - C 中的 Kruskal 算法 - 无法保存到文件

c++ - 为什么当我访问一个由三个整数组成的对象时,它会从基指针而不是堆栈指针中减去?