C'de bir dizgi dizisi oluşturmanın birkaç yolu vardır. Tüm dizeler aynı uzunlukta olacaksa (veya en azından aynı maksimum uzunluğa sahip olacaksa), 2 boyutlu karakter dizisini bildirmeniz ve gerekirse atamanız yeterlidir:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");
Başlatıcıların bir listesini de ekleyebilirsiniz:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
Bu, başlatıcıdaki dizelerin boyutunun ve sayısının dizi boyutlarınızla eşleştiğini varsayar. Bu durumda, her dize değişmezinin içeriği (kendisi sıfır sonlu bir char dizisidir) strs'ye ayrılan belleğe kopyalanır. Bu yaklaşımdaki sorun, iç parçalanma olasılığıdır; 5 veya daha az karakter içeren 99 dizeniz varsa, ancak 20 karakter uzunluğunda 1 dizeniz varsa, 99 dizede en az 15 kullanılmayan karakter olacaktır; bu bir yer kaybı.
2-b karakter dizisi kullanmak yerine, 1-b işaretçiler dizisini char olarak kaydedebilirsiniz:
char *strs[NUMBER_OF_STRINGS];
Bu durumda, yalnızca işaretçileri dizelere tutmak için bellek ayırdığınızı unutmayın; (statik diziler olarak kullanarak veya kendileri başka bir yerde tahsis edilmelidir dizeleri bellek malloc()
veya calloc()
). Başlatıcı listesini önceki örnek gibi kullanabilirsiniz:
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
Dize sabitlerinin içeriğini kopyalamak yerine, yalnızca işaretçileri saklıyorsunuz. Dize sabitlerinin yazılamayabileceğini unutmayın; işaretçiyi aşağıdaki gibi yeniden atayabilirsiniz:
strs[i] = "bar";
strs[i] = "foo";
Ancak dizenin içeriğini değiştiremeyebilirsiniz; yani
strs[i] = "bar";
strcpy(strs[i], "foo");
izin verilmeyebilir.
Sen kullanabilirsiniz malloc()
dinamik olarak her dizesi için tampon tahsis etmek ve bu tampon kopyalamak:
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
BTW,
char (*a[2])[14];
A'yı, 2 elemanlı char dizisine işaret eden 2 elemanlı bir dizi olarak bildirir.
char (*a[2])[14]
14 karakterlik bir diziye iki işaretçi dizisidir.