dinamik 2B dizi tahsis için:
char **p;
int i, dim1, dim2;
/* Allocate the first dimension, which is actually a pointer to pointer to char */
p = malloc (sizeof (char *) * dim1);
/* Then allocate each of the pointers allocated in previous step arrays of pointer to chars
* within each of these arrays are chars
*/
for (i = 0; i < dim1; i++)
{
*(p + i) = malloc (sizeof (char) * dim2);
/* or p[i] = malloc (sizeof (char) * dim2); */
}
/* Do work */
/* Deallocate the allocated array. Start deallocation from the lowest level.
* that is in the reverse order of which we did the allocation
*/
for (i = 0; i < dim1; i++)
{
free (p[i]);
}
free (p);
yukarıdaki yöntemi değiştirin. Eklenecek başka bir satıra ihtiyacınız olduğunda *(p + i) = malloc (sizeof (char) * dim2);
yapın ve i
'u güncelleyin. Bu durumda, p
dizisini ilk kez tahsis ettiğimiz dim1
değişkeniyle belirtilen dosyadaki maksimum satır sayısını tahmin etmelisiniz. Bu, (sizeof (int *) * dim1)
baytları yalnızca char p[dim1][dim2]
'dan (c99'da) çok daha iyi bir seçenek olarak ayıracaktır.
Sanırım başka bir yolu var. Dizileri bloklara ayırın ve taşma olduğunda bunları zincirleyin.
struct _lines {
char **line;
int n;
struct _lines *next;
} *file;
file = malloc (sizeof (struct _lines));
file->line = malloc (sizeof (char *) * LINE_MAX);
file->n = 0;
head = file;
Bundan sonra ilk blok kullanıma hazırdır. Bir çizgi eklemek gerektiğinde sadece yapın:
n
LINE_MAX
başka bir blok tahsis ve buna bağlamak edilir
/* get line into buffer */
file.line[n] = malloc (sizeof (char) * (strlen (buffer) + 1));
n++;
.
struct _lines *temp;
temp = malloc (sizeof (struct _lines));
temp->line = malloc (sizeof (char *) * LINE_MAX);
temp->n = 0;
file->next = temp;
file = file->next;
Böyle bir şey. bir blok en n
0
olduğunda
, bunu ayırması ve bir öncekine geçerli blok işaretçisi file
güncelleyin. Tek bağlantılı listeden başlayıp, en baştan hareket edebilir ya da çift linkleri kullanabilirsiniz.
Sen işlevini 'kullanabilirsiniz sonradan dizinin boyutunu değiştirmek için realloc'. – Jonathon
Bu işleve bakıp nasıl uygulayabileceğimi düşünmeye çalışacağım ve size geri döneceğim, teşekkürler – Rob