Jak dynamicznie przydzielić tablicę ciągów w C?


Jestem noobem, więc nie bądź dla niego surowa.
Zamiast czegoś takiego;
char string[NUM OF STRINGS][NUM OF LETTERS];

Czy jest możliwe dynamiczne przydzielanie liczby ciągów znaków w tablicy z malloc, tak jak dynamiczne przydzielanie pamięci dla wskaźnika char? Coś w tym stylu:
int lines;
scanf("%d", &lines);
char *string[NUM OF LETTERS]
string = malloc(sizeof(char) * lines);

Próbowałem, ale to nie zadziałało; Muszę robić coś złego.
Inne rozwiązanie, o którym pomyślałem, to:
int lines;
scanf("%d", &lines);
char string[lines][NUM OF LETTERS];

ale chcę wiedzieć, czy jest to możliwe w przypadku malloc.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz również użyć
malloc
dla każdego słowa like
char **array;
int lines;
int i; while (scanf("%d", &lines) != 1);array = malloc(lines * sizeof(char *));
if (array != NULL)
{
for (i = 0 ; i < lines ; ++i)
{
int numberOfLetters; while (scanf("%d", &numberOfLetters) != 1);
array[i] = malloc(numberOfLetters);
}
}

gdzie
numberOfStrings
i
lengthOfStrings [i]
to liczby całkowite reprezentujące liczbę ciągów, które chcesz zawrzeć w tablicy, oraz długość łańcucha
i
th odpowiednio w tablicy.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Masz na to dwa sposoby.
Pierwsza jest bardziej złożona, ponieważ wymaga alokacji pamięci dla tablicy wskaźników do ciągów, a także alokacji pamięci dla każdego ciągu.
Możesz przydzielić pamięć dla całej tablicy:
char (*array)[NUM_OF_LETTERS];// Pointer to char's array with size NUM_OF_LETTERS
scanf("%d", &lines);
array = malloc(lines * NUM_OF_LETTERS);. . .
array[0] = "First string\n";
array[1] = "Second string\n";
// And so on;

Wadą drugiej metody jest to, że
NUM_OF_LETTERS
bajtów jest przydzielanych dla każdego wiersza. Dlatego jeśli masz dużo krótkich stringów, pierwsza metoda będzie dla Ciebie lepsza.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W przypadku, gdy potrzebujesz ciągłej alokacji pamięci:
char **string = malloc(nlines * sizeof(char *));
string[0] = malloc(nlines * nletters);
for(i = 1; i < nlines; i++)
string[i] = string[0] + i * nletters;

Bardziej szczegółowe wyjaśnienie: przeczytaj

Lista często zadawanych pytań Pytanie 6.16
http://www.c-faq.com/aryptr/dynmuldimary.html
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

int lines;
scanf("%d", &lines);
char (*string)[NUM OF LETTERS]
string = malloc(sizeof(*string) * lines);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

char **ptop;
int iStud;
int i;
printf("Enter No. of Students: ");
scanf("%d",&iStud);ptop=(char **) malloc(sizeof(char)*iStud);
flushall();
for(i=0;i<iStud;i++)
{
ptop[i]=(char *) malloc(sizeof(char)*50);
gets(ptop[i]);
}
for(i=0;i<iStud;i++)
{
puts(ptop[i]);
}
free(ptop);

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się