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