URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2001
[ Назад ]

Исходное сообщение
"Работа с памятью в С"

Отправлено forfreeuse , 18-Авг-03 23:30 
Есть массив строк, который нужно загнать в память, не затратив при этом лишнего и в последствии быстро работать с этим массивом.

Делаю массив указателей:
mas=malloc(sizeof(char *) * 4);

и загоняю в него указатели на вновь-созданные блоки памяти
mas[0]=strdup("betta");

все пучком и работает, да вот беда, потом ссылки на элементы массива очень корявые получаются, тяжело с ними работать
Например, в примере ниже приходиться писать в функции сравнения двойной указатель, иначе не работает.

А если нужно работать с символом из строки, то совсем беда.
Если для char k[100];  можно было быстро и аккуратно сделать *k=3; k++;
То с массивом указателей это дело не проходит, приходиться или вводить дополнительные указатели или копировать данные в char tmp[100] для дальнейшей работы.
Подскажите, если выход?

Пример:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(const void **a1, const void **a2)
{
printf("cmp: %s vs %s\n",*a1,*a2);
return(strcmp(*a1,*a2));
}

void main (void)
{
unsigned char ** mas;

mas=malloc(sizeof(char *) * 4);
if (mas==NULL) {printf("Error 1\n"); exit(-1);}

mas[0]=strdup("betta");
mas[1]=strdup("gamma");
mas[2]=strdup("alpfa");
mas[3]=strdup("tetta");

qsort(mas,4,sizeof(char*),compare);

free(mas[0]);
free(mas[1]);
free(mas[2]);
free(mas[3]);
free(mas);
}


Содержание

Сообщения в этом обсуждении
"Работа с памятью в С"
Отправлено Мартовский заец , 24-Авг-03 12:18 
>Есть массив строк, который нужно загнать в память, не затратив при этом
>лишнего и в последствии быстро работать с этим массивом.
>
>Делаю массив указателей:
>mas=malloc(sizeof(char *) * 4);
>
>и загоняю в него указатели на вновь-созданные блоки памяти
>mas[0]=strdup("betta");
>
>все пучком и работает, да вот беда, потом ссылки на элементы массива
>очень корявые получаются, тяжело с ними работать
>Например, в примере ниже приходиться писать в функции сравнения двойной указатель, иначе
>не работает.
>
>А если нужно работать с символом из строки, то совсем беда.
>Если для char k[100];  можно было быстро и аккуратно сделать *k=3;
>k++;
>То с массивом указателей это дело не проходит, приходиться или вводить дополнительные
>указатели или копировать данные в char tmp[100] для дальнейшей работы.
>Подскажите, если выход?
>
>Пример:
>#include <stdio.h>
>#include <stdlib.h>
>#include <string.h>
>
>int compare(const void **a1, const void **a2)
>{
> printf("cmp: %s vs %s\n",*a1,*a2);
> return(strcmp(*a1,*a2));
>}
>
>void main (void)
>{
> unsigned char ** mas;
>
> mas=malloc(sizeof(char *) * 4);
> if (mas==NULL) {printf("Error 1\n"); exit(-1);}
>
> mas[0]=strdup("betta");
> mas[1]=strdup("gamma");
> mas[2]=strdup("alpfa");
> mas[3]=strdup("tetta");
>
> qsort(mas,4,sizeof(char*),compare);
>
>
>
> free(mas[0]);
> free(mas[1]);
> free(mas[2]);
> free(mas[3]);
> free(mas);
>}

Привы!
Я не понял проблемы:(
Зачем так сложно массив указателей описывать и создавать???

>unsigned char ** mas;
>
>mas=malloc(sizeof(char *) * 4);
>if (mas==NULL) {printf("Error 1\n"); exit(-1);}

Вместо этого мона было просто написать:
char* mas[4]; - смысл: массив из 4-х элементов - указателей на char.
И применение тада простое:
  mas[num] - указатель на строку
  mas[num][index] - символ номер index в строке num.
При таком объявлении не нада проверять полученный адрес массива на NULL.

>То с массивом указателей это дело не проходит, приходиться или вводить >дополнительные указатели или копировать данные в char tmp[100] для >дальнейшей работы.

Вот тут совсем ничего не понял:( О чем речь конкретно???