Перейти к содержанию

Как определить массив


Рекомендуемые сообщения

Имеется указатель (*k) на память выделенный malloc.

Хочеться работать с этой памятью как с массивом k[x][100], то еть обращатся так

sprintf(k[10],"test");

как сказать на сях, что это память являеться массивом?

#include

int main(void)

{

int z,size=100000;

char *k;

k=(char*)malloc(size*100+1);

if (k==NULL) {printf("Can't allocate memory\n"); exit(-1);}

sprintf(k[10],"test");

return (0);

}

Ссылка на комментарий
Поделиться на другие сайты

[ananas@victor:ananas]$ cat rrr.c

#include

#include

int main()

{

int i;

char* k;

k = strdup("test");

for (i=0;i<4;i++) {

printf("%c\n", k);

}

return (0);

}

[ananas@victor:ananas]$ gcc rrr.c

[ananas@victor:ananas]$ ./a.out

t

e

s

t

[ananas@victor:ananas]$

Ссылка на комментарий
Поделиться на другие сайты

послушайте, я вам привел пример, демонстрирующий, что к указателю можно обращаться как к массиву. введите char **k; и вперед.

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

rtfm уже не модно? или религия не позволяет?

Ссылка на комментарий
Поделиться на другие сайты

Да нет, все понятно, что вы написали, но беда в том, что массив двухмерный.

Про одномерный и так понятно, а вот про двухмерный и в доках ничего не смог найти.

допустим нужен массив char mas[z][100]

что бы обращаться к его элементом так:

sprintf(mas[1],"test");

Надо же как-то определить, что длинна строки в массиве равна сотне.

Ссылка на комментарий
Поделиться на другие сайты

те же яйца, только в профиль

[ananas@victor:ananas]$ cat rrr.c

#include

#include

#include

int main()

{

int i;

char **k;

k = (char **)malloc(sizeof(char *) * 2);

k[0] = strdup("test");

for (i=0;i<4;i++) {

printf("%c\n", k[0]);

}

return (0);

}

длину вы определяете при выдилении памяти (в данном примере память выделяет strdup)

для большей безопасности (если вам так уж нравится sprintf) лучше использовать snprintf

[ananas@victor:ananas]$ gcc rrr.c

[ananas@victor:ananas]$ ./a.out

t

e

s

t

[ananas@victor:ananas]$

Ссылка на комментарий
Поделиться на другие сайты

Смущает, я хотел по массиву qsort'ом пройтись, а там нужен фиксированный размер элемента.

Впрочем в плане экономии памяти Ваш вариант совсем неплох. А отсортировать наверное можно предварительно во временном массиве.

Спасибо за помошь!

Один вопрос, с таким масивом указателей программа не будет работать медленее чем с обычным массивом?

Ссылка на комментарий
Поделиться на другие сайты

qsort не проблема, если вы на каждый k будете выделять одинакоый кусок памяти. или указывать размер по минимуму

смотря какая программа. обычно - нет. частенько даже быстрее, но это в основном зависит от способности программера писать "быстрый" код Smile

Ссылка на комментарий
Поделиться на другие сайты

Ananas писал(а):

>

> qsort не проблема, если вы на каждый k будете выделять

> одинакоый кусок памяти. или указывать размер по минимуму

Дык теперь жаба душит память под пустоту выделять Smile

> смотря какая программа. обычно - нет. частенько даже быстрее,

> но это в основном зависит от способности программера писать

> "быстрый" код Smile

Что же, будем учиться. Огромное спасибо за помощь!

Ссылка на комментарий
Поделиться на другие сайты

А не подскажите как strdup в плане совместимости с разными никсами? Я так понял он только в линуксе и фре есть?

Может быть более правильно делать malloc(strlen(data)) с последующим memcpy?

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Однако не получаеться qsort`ом пройтись, даже если размер элементов фиксирован:

Ниже пример, в частности он показывет, что функция сравнения от кусорта получает неправильные указатели. Или я не прав?

#include

int compare (const void *arg1, const void *arg2)

{

printf("cmp: %s %s\n",arg1,arg2);

return(strcmp(arg1, arg2));

}

int main(void)

{

char **mass;

int i,col=10,row=5;

char a0[]="sdfg", a1[]="dsyhe",a2[]="syree", a3[]="345gte",a4[]="asdf";

// Allocate memory

mass=(unsigned char**)malloc(row*sizeof(char*));

for (i=0; i

mass=(unsigned char*)malloc(col*sizeof(char));

// Set data

memcpy(mass[0],a0,strlen(a0)+1);

memcpy(mass[1],a1,strlen(a1)+1);

memcpy(mass[2],a2,strlen(a2)+1);

memcpy(mass[3],a3,strlen(a3)+1);

memcpy(mass[4],a4,strlen(a4)+1);

//Print data

for (i=0; i

printf("%s\n",mass);

qsort(mass,row,col,compare);

//Print data

for (i=0; i

printf("%s\n",mass);

return(0);

}

Ссылка на комментарий
Поделиться на другие сайты

Читал перечитывал, бестолку. Причем тот же приведенный выше пример замечательно работает, но с массивом, а не со списком указателей.

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

Ссылка на комментарий
Поделиться на другие сайты

нет, 5 это не размер, а количество элементов, точнее говоря колличество строк. А размер этих строк col=10

толи лыжи не едут, толи я ...

Вы пробовали откомпилить-запустить приведенный выше пример?

Ссылка на комментарий
Поделиться на другие сайты

аа, блин, все дошло, приношу извинения за тугодумство. Я пытался сортировать как в массиве, содержимое, забыв о том, что надо сортировать список указателей.

Спасибо за помощь!!

Ссылка на комментарий
Поделиться на другие сайты

это без разницы. хоть 20. у вас есть массив, элементы которого имеют тип char *. длина каждого из них - 4 байта. (или не 4, зависит от архитектуры, точнее - sizeof(char *)). но никак не 5, 10 или 20.

соответсвенно qsort прыгает бог знает куда, чтобы получить адрес следующего элемента.

это должно работать -

qsort(mass, sizeof(mass)/sizeof(char *), sizeof(char *), strcmp);

Ссылка на комментарий
Поделиться на другие сайты

> это должно работать -

> qsort(mass, sizeof(mass)/sizeof(char *), sizeof(char *), strcmp);

гм, кстати, разве это может работать?

Объясните пожалуйста бестолковому, но:

1. mass это ведь указатель на указатель, и эго размер скорее всего тот же, что и у sizeof(char **)

2. strcmp в качестве аргументов требует (const void *, const void *), а у нас скорее (const void **, const void **) с последующим сравнением в функции return(strcmp(*arg1, *arg2));

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...