2017-09-05 92 views
1

我想实现自己的教育字符串实现。对于我定义了一个名为字符串结构如下:写入双重const指针

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

+5

等等。为什么你要让所有成员'const'然后违反它们的常量? –

+0

@Daniel Kamil Kozar我只在创建字符串时违反了它。在创建之后,它不应该被改变(因此consts) –

+7

为什么不让类型不透明,以便用户不能在结构内部钻研,因此除了使用您提供的访问函数之外不能修改它。当你添加许多'const'限定符时,你会使结构变得不可修改,因此必须对SO提出问题。你在做什么并不好;事实上你滥用演员才能使其发挥作用表明你所做的不好。 –

回答

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混淆。