我想为教育实现自己的字符串实现。为此,我定义了一个名为 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/