2009-11-29 9 views
5

해당 요소를 스택이 아닌 실행 파일의 읽기 전용 세그먼트에 저장하는 (고정 된) 배열을 사용할 수 있습니까? 나는이 코드를 만들었지 만 불행하게도 항목을 추가, 이동 또는 삭제할 때 매우 융통성이 없다. 문자열이 실제로 읽기 전용 세그먼트에 저장되었는지 어떻게 확인합니까? readelf - 파일을 시도했지만 문자열을 나열하지 않습니다. 상수 문자열 배열

typedef struct { 
     int len; 
     int pos[100]; 
     char data[500]; 
} FixedStringArray; 

const FixedStringArray items = { 
     4, 
     { 9, 14, 19, 24 }, 
     "LongWord1Word2Word3Word4" 
} ; 

char* GetItem(FixedStringArray *array, int idx, int *len) { 
     if (idx >= array->len) { 
       /* Out of range */ 
       *len = -1; 
       return NULL; 
     } 

     if (idx > 0) { 
       *len = array->pos[idx] - array->pos[idx - 1]; 
       return & array->data[array->pos[idx - 1]]; 
     } 

     *len = array->pos[idx]; 
     return & array->data[0]; 
} 

void PrintItem(FixedStringArray array, int idx) { 
     int len; 
     char *c; 
     int i = 0; 

     c = GetItem(&array, idx, &len); 

     if (len == -1) return; 

     while (i < len) { 
       printf("%c", *c); 
       *c++; 
       i++; 
     } 
} 

는 I 자동 각 어레이 구조체를 생성 POS 및 데이터의 올바른 길이를 사용하는 스크립트를 고려하고있다. 메모리 사용과 관련하여 염려가 있습니까? 아니면 모든 문자열에 맞게 하나의 구조체를 만드는 것이 더 낫겠습니까?

답변

1

C 컴파일러가/또는 리터럴 문자열을 읽기 전용 메모리 (예 : 문자열 풀링을 사용하는 VC++)에 넣을 수 없습니까? 아니면 명시 적으로 순차적으로 저장되도록 명시 적으로 요구합니까?

+0

예, 전 또한 괜찮습니다. GCC가 모든 const 변수에 대해 이미 그렇게하지 않아야합니까? – user206268

21

은 내가 당신의 질문을 이해 모르겠지만, 당신은 의미합니까 :

const char * const array[] = { "LongWord1", "Word2", "Word3", "Word4" }; 

이 상수 문자에 대한 포인터의 일정한 배열을 선언합니다.

, 나 strlen을 피하기 위해에 대해 어떻게 확인 :

struct Str { 
    size_t len; 
    char *str; 
}; 
#define STR(s) { sizeof(#s) - 1, #s } 
const struct Str[] = { STR(LongWord1), STR(Word2), STR(Word3), STR(Word4) }; 
+0

그래, 그 일을 더 쉽게 만들 수 있지만 문자열에 NUL 종료를 사용하지 않는 것이 좋습니다. 나는 strlen()과 같은 외부 함수에 의존하기를 원하지 않는다. sizeof() - 1을 사용하여 컴파일 타임에 계산할 수있는 길이를 고려해야한다. – user206268

+0

"#"은 s 앞에 무엇을 의미합니까? – FrAxl93

+0

# 매크로 인수를 문자열로 변환합니다. longword1은 "longword1"이됩니다. –

0

이 질문은 다소 관련 :
으로 지적 String Literals

, ROM에서 문자열 리터럴의 저장/RAM 플랫폼/구현 종속성에 대한 예측은하지 말아야합니다. 또한 스크립트를 사용하여 적절한 크기의 배열을 읽고 생성하는 것은 매우 바람직하지 않습니다. dynamic memory에 가야합니다.

+0

링크를 제공해 주셔서 감사합니다. 그러나 ROM/RAM 난이도가 내 문제와 어떤 관련이 있습니까? 런타임 중에 문자열 버퍼에 쓰지 않습니다. 요소가 모두 고정되어 있기 때문에 동적 메모리를 사용하는 것은 의미가 없습니다. – user206268