Гость Опубликовано 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 Смущает, я хотел по массиву 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)); Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.