2009-11-29 24 views
5

Öğelerini, yürütülebilirde salt okunur parçada depolayan ve yığında olmayan (sabit) bir dizinin olması mümkün mü? Bu kodla geldim ama maalesef eşya ekleme, taşıma veya silme söz konusu olduğunda ne yazık ki çok zor değil. Dizelerin gerçekten salt okunur segmentte depolandığını nasıl doğrularım? Ben readelf- dosyasını denedim ancak dizeleri listelemiyor. Sabit dizi dizileri

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++; 
     } 
} 

otomatik olarak her bir dizi için bir yapı oluşturur ve pos ve veri için doğru uzunluğa kullanan bir komut dosyası düşünüyorum. Bellek kullanımı ile ilgili endişeler var mı? Ya da tüm dizeleri sığdırmak için bir yapı (yukarıdaki gibi) oluşturmak daha iyi olurdu?

cevap

1

C derleyiciniz herhangi bir/tüm basit dizeleri salt okunur belleğe yapıştıramıyor (örneğin, dizge havuzu etkinleştirilmiş VC++)? Yoksa açıkça bu şekilde sıralı olarak depolanmasını mı istiyorsunuz?

+0

Evet, eski de iyi olurdu. GCC bunu tüm const değişkenleri için varsayılan olarak zaten yapmamalı mı? – user206268

21

Sorunuzun anladığımdan emin değilim, ama Şunu yapın:

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

Bu sabit karakter işaretçiler sabit bir dizi beyan eder.

, strlen önlemek için, yaklaşık ne kadar Tamam:

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

Tamam, bu gerçekten işleri daha kolay hale getirirdi ancak dizeler için NUL sonlandırmayı kullanmamayı tercih ederim. Strlen() gibi harici fonksiyonlara bağımlı olmak istemiyorum, sadece derleme zamanında hesaplanabileceğini göz önünde bulundurarak (sizeof() - 1 kullanarak). – user206268

+0

Bu "#" n ne anlama geliyor? – FrAxl93

+0

#, makro değişkenini bir dizgeye çevirir örn. longword1 "longword1" haline gelir. –

0

Bu soru biraz alakalı:
olarak işaret String Literals

, ROM, dize hazır depolama/RAM platformu/uygulamasıdır bağımlı, bunun için herhangi bir tahmin yapmamalısınız. Ayrıca, uygun boyutta bir dizi okumak ve oluşturmak ve bunları saklamak için bir betik kullanmak oldukça istenmeyen bir durumdur. dynamic memory'a gitmelisin.

+0

Bağlantı için teşekkürler. Ancak ROM/RAM güçlük sorunumla nasıl bağlantılı? Çalışma zamanı sırasında string buffer'a yazmam. Elemanların tümü sabit olduğu için, dinamik hafızayı kullanmanın bir anlamı yoktur. – user206268