Гость Опубликовано 3 июля, 2003 Жалоба Поделиться Опубликовано 3 июля, 2003 Имеется указатель (*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); } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 июля, 2003 Жалоба Поделиться Опубликовано 3 июля, 2003 [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]$ Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 июля, 2003 Жалоба Поделиться Опубликовано 3 июля, 2003 А где же массив? Повторяю, нужно работь с массивом вида char mas[x][100]; Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 июля, 2003 Жалоба Поделиться Опубликовано 3 июля, 2003 послушайте, я вам привел пример, демонстрирующий, что к указателю можно обращаться как к массиву. введите char **k; и вперед. вам что, сложно взять любую доку по сям и почитать про ссылочную арифметику, масивы и прочие, нужные вам структуры и конструкции языка? rtfm уже не модно? или религия не позволяет? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 июля, 2003 Жалоба Поделиться Опубликовано 3 июля, 2003 Да нет, все понятно, что вы написали, но беда в том, что массив двухмерный. Про одномерный и так понятно, а вот про двухмерный и в доках ничего не смог найти. допустим нужен массив char mas[z][100] что бы обращаться к его элементом так: sprintf(mas[1],"test"); Надо же как-то определить, что длинна строки в массиве равна сотне. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 июля, 2003 Жалоба Поделиться Опубликовано 3 июля, 2003 те же яйца, только в профиль [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]$ Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 июля, 2003 Жалоба Поделиться Опубликовано 3 июля, 2003 Это я так понимаю получаеться массив указателей? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 июля, 2003 Жалоба Поделиться Опубликовано 3 июля, 2003 да. вас это смущает? ) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 июля, 2003 Жалоба Поделиться Опубликовано 3 июля, 2003 Смущает, я хотел по массиву qsort'ом пройтись, а там нужен фиксированный размер элемента. Впрочем в плане экономии памяти Ваш вариант совсем неплох. А отсортировать наверное можно предварительно во временном массиве. Спасибо за помошь! Один вопрос, с таким масивом указателей программа не будет работать медленее чем с обычным массивом? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 июля, 2003 Жалоба Поделиться Опубликовано 3 июля, 2003 qsort не проблема, если вы на каждый k будете выделять одинакоый кусок памяти. или указывать размер по минимуму смотря какая программа. обычно - нет. частенько даже быстрее, но это в основном зависит от способности программера писать "быстрый" код Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 июля, 2003 Жалоба Поделиться Опубликовано 3 июля, 2003 Ananas писал(а): > > qsort не проблема, если вы на каждый k будете выделять > одинакоый кусок памяти. или указывать размер по минимуму Дык теперь жаба душит память под пустоту выделять > смотря какая программа. обычно - нет. частенько даже быстрее, > но это в основном зависит от способности программера писать > "быстрый" код Что же, будем учиться. Огромное спасибо за помощь! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 июля, 2003 Жалоба Поделиться Опубликовано 3 июля, 2003 > Дык теперь жаба душит память под пустоту выделять а вы про free не забывайте Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 4 июля, 2003 Жалоба Поделиться Опубликовано 4 июля, 2003 А не подскажите как strdup в плане совместимости с разными никсами? Я так понял он только в линуксе и фре есть? Может быть более правильно делать malloc(strlen(data)) с последующим memcpy? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 4 июля, 2003 Жалоба Поделиться Опубликовано 4 июля, 2003 как делать - каждый решает для себя сам. главное - чтоб работало, и не стыдно было код другим показать Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 21 июля, 2003 Жалоба Поделиться Опубликовано 21 июля, 2003 Однако не получаеться 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); } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 21 июля, 2003 Жалоба Поделиться Опубликовано 21 июля, 2003 man qsort там все написано. а для размеров лучше пользоваться sizeof Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 21 июля, 2003 Жалоба Поделиться Опубликовано 21 июля, 2003 Читал перечитывал, бестолку. Причем тот же приведенный выше пример замечательно работает, но с массивом, а не со списком указателей. я так думаю qsort считает, что ей попадает указатель на непрерывный массив, с которым можно работать по формуле адрес=номер строки * длинна строки. А со списком указателей это не проходит, отсуда и все проблемы. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 21 июля, 2003 Жалоба Поделиться Опубликовано 21 июля, 2003 sizeof используй. у тебя размер элемента - 5, а sizeof(char *) - 4 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 21 июля, 2003 Жалоба Поделиться Опубликовано 21 июля, 2003 нет, 5 это не размер, а количество элементов, точнее говоря колличество строк. А размер этих строк col=10 толи лыжи не едут, толи я ... Вы пробовали откомпилить-запустить приведенный выше пример? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 21 июля, 2003 Жалоба Поделиться Опубликовано 21 июля, 2003 аа, блин, все дошло, приношу извинения за тугодумство. Я пытался сортировать как в массиве, содержимое, забыв о том, что надо сортировать список указателей. Спасибо за помощь!! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 21 июля, 2003 Жалоба Поделиться Опубликовано 21 июля, 2003 это без разницы. хоть 20. у вас есть массив, элементы которого имеют тип char *. длина каждого из них - 4 байта. (или не 4, зависит от архитектуры, точнее - sizeof(char *)). но никак не 5, 10 или 20. соответсвенно qsort прыгает бог знает куда, чтобы получить адрес следующего элемента. это должно работать - qsort(mass, sizeof(mass)/sizeof(char *), sizeof(char *), strcmp); Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 21 июля, 2003 Жалоба Поделиться Опубликовано 21 июля, 2003 > это должно работать - > 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)); Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.