2017-09-05 10 views
1

교육을위한 자체 문자열 구현을 구현하고 싶습니다. 이를 위해 다음과 같이 string이라는 구조체를 정의했습니다.const 포인터를 double에 쓰기

struct string { 
    const char *const data; 
    const int length; 
}; 

이 문자열 구조체를 만드는 함수를 사용하여 변수에 할당합니다.

*(int *) &result.length = // a int 

지금 나는 또한 const char *const data에 쓰고 싶은 : 나는 다음과 같은 트릭을 사용하는 const int length를 대체하기 위해

. 내가 아는 한 처음 const은 포인터가 가리키는 항목을 편집 할 수 없도록하고 두 번째 const은 포인터를 다른 메모리 위치로 지정할 수 없다는 것을 확인합니다. 이것들은 변경 불가능한 문자열의 속성입니다. 그래서 제 질문은 : const int length처럼 내가 어떻게 const char *const data에 할당 할 수 있습니까?

편집 : result 위와 선언에서 struct string에게 초기화 구조체 string

+5

기다림. 왜 모든 멤버를 'const'로 만들고 그 constness를 위반합니까? –

+0

@ Daniel Kamil Kozar 문자열을 만들 때만 위반합니다. 생성 된 후에는 변경해서는 안됩니다 (따라서 consts) –

+7

사용자가 구조 내부를 조사 할 수 없도록 사용자가 구조를 해석 할 수 없도록 사용자가 제공하는 액세스 기능을 사용하는 경우를 제외하고는 유형을 불투명하게 만들지 마십시오. 그 많은'const' 한정자를 추가하면 구조체를 수정할 수 없게됩니다. 따라서 여러분은 반드시 SO에 대해 질문해야합니다. 당신이하는 일은 좋지 않습니다. 캐스팅을 남용하여 효과를 낼 수 있다는 사실은 자신이하는 일이 좋지 않다는 표시입니다. –

답변

1

형태의 예와 같이.

는 또한 크기 아닌 길이를 저장하고 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의 유용성을 제한으로 struct string retval = {"World", 6}; 같은 리터럴 문자열로 초기화하지 않는 것이 좋습니다.

불투명도를 사용하면 으로 다른 코드를 어지럽히 지 않도록이 접근법을 초과하는 많은 이점이 있습니다 (@Jonathan Leffler).