Alokacja dynamicznej tablicy stringów

0

Cześć. Mam problem z alokacja dynamicznej tablicy stringów w c. Chce zadeklarowac 10 napisow string po 24 litery.

 char (*name)[24];
name= (char**)malloc(sizeof(char*)*10);

Umiałby ktoś powiedzieć, jak to zrobić poprawnie?
Dziękuje za bardzo pomoc.

0

A chcesz to mieć w jednym bloku? To alokuj po prostu 10*25 bajtów :P
Chcesz mieć taki quasi-tablicowy dostęp?
Zrób malloc tablicy wskaźników do stringów a potem w pętli każdy wskaźnik ustaw na zaalokowany 25 znakowy string.

0

Dzieki. Aaa to nie da się bez petli, tego zalakować , bezpośrednio, tak jak myślałem?

0

Nie. No chyba ze zaalokujesz od razu 25*10 bajtów ale wtedy nie będziesz mógł sie odnosić do tego jak do tablicy z 10 elementami.

0

Aha, dzieki. Ale to w sumie całkiem zaskaujące. Bo ta definicja która podałem, oznacza wskaźnik na tablice.
Edit. Widziałem, że jakoś się da!

char (*name)[24];
name=(char*)malloc(10* sizeof(char)*24);
0

Da się tak zrobić tylko radzę ładniejszy zapis, bo w takim nawet @Shalom nie dopatrzył się poprawności.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char tab24[3];

int main()
  {
   tab24 *tb=(tab24*)malloc(4*sizeof(tab24));
   strcpy(tb[0],"ABC");
   strcpy(tb[1],"DEF");
   strcpy(tb[2],"GHI");
   strcpy(tb[3],"JK");
   printf("%d \"%s\"\n",sizeof(tab24),tb);
   return 0;
  }

http://ideone.com/TmIw21

0
Bratq napisał(a):

Cześć. Mam problem z alokacja dynamicznej tablicy stringów w c. Chce zadeklarowac 10 napisow string po 24 litery.

char (*name)[24];
name= (char**)malloc(sizeof(char*)*10);

Umiałby ktoś powiedzieć, jak to zrobić poprawnie?
Dziękuje za bardzo pomoc.

Możliwości jest kilka, wersja z oszczędnością pamięci (allokowanie jednego kawałka pamięci):

char ** allocCharTable(int rows, int columns) {
     int alignedColumns = ((columns+3)/4)*4;
     char ** result = (char**)alloc(sizeof(char*)*rows + sizeof(char)*alignedColumns);
     if (result) {
         int i;
         for (i=0; i<rows; ++i) {
             result[i] = ((char*)(result+rows))+alignedColumns*i;
         }
     }
     return result;
}

char **name = allocCharTable(stringsCount, maxStringLength+1);

1 użytkowników online, w tym zalogowanych: 0, gości: 1