2010-11-21 28 views
6

Genel yapmak istediğim bir dizi var ve bir işlev çağrısında başlatmak istiyorum. Ben ilk o boyutunu bilmeden beyan etmek istiyorum:C - Bir işlevde genel bir dizinin başlatılması

char str[]; 

ve daha sonra başlatmak:

str = char[size]; 

Bu nasıl yapabilirim? Ben c için çok yeni ve belki tamamen yanlış yolu burada gidiyorum, herhangi bir yardım büyük takdir edilecektir.

cevap

7

Bunu yapmanın yolu malloc ile. İlk sadece bir işaretçi bildirmek:

char *str; 

Sonra init fonksiyonu Eğer malloc içeri:

str = malloc(sizeof(*str) * size_of_array); 

Bunun anlamı str puan (bu durumda char) için boyutunun size_of_array elemanlarını ayırır. ayırma başarısız olursa

Sen kontrol etmelisiniz:

if (str == NULL) { 
    // allocation failed 
    // handle the error 
} 

Normalde onunla bittiğinde emin free bu ayrılan bellek yapmak zorunda. Ancak, bu durumda str globaldir, bu yüzden hiçbir zaman kapsam dışı kalmaz ve program bittiğinde bellek free d olacaktır.

+4

gerçekten malloc'un sonucu döküm olmamalıdır - C++ 'da bunu gerçekten yapmanız gerekir - aksi takdirde yardımcı uyarıları maskeleyebileceğinden C'den kaçınılmalıdır. –

+2

Genel olmak istiyorsanız, 'sizeof (* str)' komutunu kullanın, bu nedenle tür adını tekrarlamak zorunda kalmazsınız. Dahası, C'de malloc sonucunu vermemelisiniz. –

+2

@Paul, @Ben: teşekkürler, anwer'i güncelledim –

1
char* str; 

str = (char*)malloc(size*sizeof(char)); 

Sen tanım gereği sizeof(char) == 1 beri *sizeof(char) atlayabilirsiniz.

free

+2

Genel olmak istiyorsanız, 'sizeof (* str)' komutunu kullanın, bu nedenle tür adını tekrarlamak zorunda kalmazsınız. Dahası, C'de malloc sonucunu vermemelisiniz. –

+1

C de malloc'un sonucunu gerçekten vermemelisiniz - sadece C++ 'da bunu yapmanız gerekir - aksi takdirde yardımcı uyarıları maskeleyebileceğinden C'den kaçınılmalıdır. –

1

bir dizi yerine bir char* str; oluşturma kullanarak bellek ayırması unutmayın. Ardından, malloc veya calloc kullanarak gerekli bellek miktarını tahsis edin ve işlev çağrısında kendisini başlatma işlemini yapın. senin başlatma işlevi Sonra

char *str = NULL; 

böyle bir şey yapmak:

2

global dizi bildirisinin bu gibi görünmesini sağlayın C'de

void init(int size) 
{ 
    ... 
    str = malloc(size * sizeof(char)); 
    ... 
} 
+1

'sizeof (char)' tanıma göre 1'dir. Herhangi bir türle çalışan bir kod yazmak istiyorsanız, 'sizeof (* str)' komutunu kullanın. –

+0

@Ben: true, ancak türden bağımsız olarak 'sizeof' eklemek iyi bir alışkanlıktır.Ben bu argümanın “sizeof (* str)” lehine olduğunun bilincindeyim, ama yine de bu durumda sizeof (char) 'yi tercih ediyorum. –

İlgili konular