The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Работа с памятью в С, !*! 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);
}

  • Работа с памятью в С, !*! Мартовский заец, 12:18 , 24-Авг-03 (1)
    >Есть массив строк, который нужно загнать в память, не затратив при этом
    >лишнего и в последствии быстро работать с этим массивом.
    >
    >Делаю массив указателей:
    >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] для >дальнейшей работы.

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру