2017-09-05 100 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混淆。