LINUX.ORG.RU

Помогите разобраться с malloc СИ

 ,


0

3

Здравствуйте.

Есть функция в которой есть две переменные для массивов - buff и trans_rate:

void rate_coin(char *coin)
 {
    FILE *rat_coi;
    char *buff = (char*) malloc(128 * sizeof(char));
    snprintf(buff, (int)strlen(coin) + 59, "%s%s%s", "curl https://api.coinmarketcap.com/v1/ticker/", coin, "/ 2>/dev/null"); 
    printf("Coinmarketcap: %s\n", buff);
    rat_coi = popen(buff, "r"); 
    if(rat_coi == NULL) error_log("rat_coi!");

    char trans_rate[128] = {0,};
    //char *trans_rate = (char*) malloc(128 * sizeof(char));
    int count = 0;
    strcat(trans_rate, "RATE COIN\n");
    memset(buff, 0, 128);
    while(fgets(buff, 126, rat_coi) != NULL)
     {
       count++;
       if(count > 8) break;
       if(count == 4 || count == 7 || count == 8)
        {
          char *pch = strtok(buff, " ,\"");
          while(pch != NULL)
           {
             char *ptr = strchr(pch, ':');
             if(ptr!=NULL) *ptr = ' ';
             strcat(trans_rate, pch);
             pch = strtok(NULL, " ,\"");
           }
        }
     }

    trans_rate[strlen(trans_rate) - 1] = 0;
    SendMessage(glob_chat_id, trans_rate);
    free(buff);
    printf("%s\n\n", trans_rate);
    //free(trans_rate);
 }

Для переменной buff делаю malloc, использую её в функции snprintf(buff, ...). После этого очищаю buff с помощью memset(buff,...), использую её же в функции while(fgets(buff,...) и в конце освобождаю память - free(buff);.

Для переменной trans_rate выделяю нужное кол-во байт и использую её.

Всё работает хорошо.

Если же для переменной trans_rate тоже делать malloc (строчка закомментирована) вместо char trans_rate[128] = {0,};, то прога начинает вести себя непредсказуемо, как будто перекрываются массивы (в printf попадают непонятные символы):

h�"�WRATE COIN

Объясните пожалуйста, почему в данном случае для buff malloc работает, а для trans_rate нет?


Ответ на: комментарий от rustonelove

Срочно за букварь.

Мальчик, вы зачем зарегистрировались? Чтобы вас успели прочитать до того как вынести в игнор? Так для зарегенных это ещё удобнее. Не дрогнет рука же, тут то точно ловить умные мысли не получится, в отличии от некоторых других анонимусов.

vodz ★★★★★
()
Ответ на: комментарий от anonymous

После того, как отработает функция, которая поюзает этот буфер - в нём будут уже не нули. Тебе так же надо почитать букварь.

rustonelove
()
Ответ на: комментарий от vodz

Мальчик, вы зачем зарегистрировались?

Ламерюжки любят кукарекать с надеждой в то, что в треде их читают такие же ламерки. Что они могут нести ахинею с понимающим видом и никто им за это по рукам не даст.

Тебе задали конкретные вопросы по поводу твоей потуги - ты обделался. Что ещё и кому надо? Ничего. А пытаться кукарекать и пугать меня игнором - ты можешь сколько угодно. Ламерок он и есть ламерок.

rustonelove
()
Ответ на: комментарий от Virtuos86

а в этом вас по правим товарищь!

в тифоне когда вложенные def и прочий local есть намёк что записи активации менеджаться как стек (при случае отсутсвий всяких запыканий)

и это не глубины байткода - о коментарии(т.е. неформальная часть в отличии от дефиниций языка) в доках о языке.

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

anonymous
()
Ответ на: комментарий от anonymous

Опять какой-то рандомный мастер пердежа в лужу всплыл? У вас там на всех одна проблема - полная неспособность отвечать на вопросы, да и вообще хоть как-то отвечать, вразумительно.

rustonelove
()
Ответ на: комментарий от anonymous

В чём же бомбит? Где бомбит? Если я клоуна называю клоуном, то у меня бомбит? Или как?

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

И неважно к какой касте причисляет себя балабол. Я именно поэтому всегда писал, что моя сишка не ваша сишка. Потому что адепт сишки такая же ламерюга, как и все остальные. Тут есть свою нюансы, но все( а особенно сами ламерки) думают, что раз они там понюахли хелворды на сишке, либо им кто-то там что-то рассказал - они уже эксперты всея производительности, системы, матчасти.

А жопа у меня треснула на этого персонажа потому, что он уже минимум 2раза ретранслириловал одну и ту же херню.

rustonelove
()
Ответ на: комментарий от xpahos

Да, существуют аллокаторы, которые заранее собирают себе маленький слаб, но не все это делают.

Не совсем так. Любой маллок не зовёт «sbrk/brk/mmap» напрямую как минимум из-за того, что всё это не работает на тех блоках, для которых и используется маллок. Распределение маллоком обладает намного меньшей гранулярностью, нежели системное.

Поэтому, маллок будет как минимум просить ядро не всегда в большинстве случаев.

rustonelove
()
Ответ на: комментарий от xpahos

Хотя нет, я слишком переоценил умственные способности твоих оппонентов.

rustonelove
()
Ответ на: комментарий от anonymous

strace посмотри!

Опять эксперты в треде. Я уже другому эксперту сообщил и ты почитай. То, что ты там нюхал в сишечке - это libc, а не сисколы. Как минимум враппер. Даже syscall() враппер.

В любом случае всё это функции из libc, как и malloc().

rustonelove
()
Ответ на: комментарий от rustonelove

Йоп твою мать!

А libc сисколлы не вызывает? Да ты без сисколлов тупо даже файл открыть не сможешь, потому что ФС обычно в пространстве ядра! И даже fuse работает через ядреную прослойку. Если malloc вызывает mmap, то это тоже сисколл. И т.д., и т.п.

что-то ты, царь, опростоволосился!

anonymous
()
Ответ на: комментарий от Deleted

Операции аппратного IO и никак иначе.

Ну практически для этого существует разновидность операций у ioctl(). Так что почти и около как-то так...

vodz ★★★★★
()
Ответ на: комментарий от anonymous

А libc сисколлы не вызывает?

Что ты несёшь, упоротый. Сисколы отдельно, а сишная параша отдельно. Тебе сказали, что ты, как и эксперт выше не смогли отличить жопу от пальца.

А твои потуги про то, что там я могу, а что нет - это ахинея, которая не имеет никакого отношения к теме.

С таким уровнем потуг всё является сисколом. Любая функция так или иначе вызывает сискол. А значит любая функция - сискол.

rustonelove
()
Ответ на: комментарий от anonymous

Прокукарекался ты, а долбанулся я. Удобно. Просто запомни на будущие, что всё сисколы, которые ты зовёшь - это libc-обёртки. И они либо не сисколы, либо всё совсем плохо. fread такая же обёртка, а на жабка-fileread - такая же обёртка. И если обёртка над сисколом == сискол, то и жабка-обёртка - сискол, и fread сискол. Что, естественно, не так.

rustonelove
()
Ответ на: комментарий от rustonelove

Любая функция так или иначе вызывает сискол.

Поняли дети? fabs() ferror() и прочая-прочая «так или иначе вызывает сискол».

а долбанулся я. Удобно.

Отож.

vodz ★★★★★
()
Ответ на: комментарий от xpahos

Над чем? malloc это обертка над sbrk/brk/mmap, пока память не будет освобождена где либо еще, malloc продолжит просить ядро выделить памяти. Да, существуют аллокаторы, которые заранее собирают себе маленький слаб, но не все это делают. Остальные объявления будут лежать в bss и при загрузке бинарника проинициализированы нулями.

malloc - библиотечная функция аллокации памяти, овеянная стандартом. Поведение с обращением к mmap всего лишь действие по умолчанию, которое может быть изменено программистом __штатным__ образом. Нет такого сискола malloc и не было никогда. И malloc() не является «обёрткой» ни над каким сисколом, это просто библиотечная функция

MKuznetsov ★★★★★
()
Ответ на: комментарий от vodz

Ты бы, ламерюжка, отвечал на то, в чё я тебя макал выше. Валяешься в дерьме - валяйся дальше.

Поняли дети? fabs() ferror() и прочая-прочая «так или иначе вызывает сискол».

Что сказать-то хотел? Там ясно и понятно какие функции я имею ввиду и я это дальше даже разжевал.

Ну и чтоб два раза не ставать - сразу макнём ламерюгу в дерьмо:

int
_IO_ferror (_IO_FILE *fp)
{
  int result;
  CHECK_FILE (fp, EOF);
  _IO_flockfile (fp);
  result = _IO_ferror_unlocked (fp);
  _IO_funlockfile (fp);
  return result;
}

Которая даже в своей убогой потуге обосралась.

rustonelove
()
Ответ на: комментарий от anonymous

Эдик, ну включи голову уже. У тебя может быть реализация libc вообще без ядра. Эмбедд, голое железо.

Deleted
()
Ответ на: комментарий от anonymous

Более того, в системах реального времени возможен malloc() с гарантированным константным временем исполнения. Страницы под кучу мапятся на этапе инициализации, а при выделении памяти из кучи поиск осуществляется по битовой карте корзин заведомо подходящего размера. O() = const

Вот тебе и «вызовы ядра».

Deleted
()
Ответ на: комментарий от rustonelove

Ты бы, ламерюжка, отвечал на то, в чё я тебя макал выше.

Я не знаю куда и кого вы там макали, бред за бесплатно не комментирую.

Ну и чтоб два раза не ставать

Ну и? Начнём с первой: CHECK_FILE (fp, EOF) - какой сискол зовёт? Ну и чтобы два раза не вставать, что там про fabs()?

vodz ★★★★★
()
Ответ на: комментарий от vodz

Я не знаю куда и кого вы там макали, бред за бесплатно не комментирую.

Обосрался и сделал вид, что не в дерьме.

Ну и? Начнём с первой: CHECK_FILE (fp, EOF) - какой сискол зовёт?

Специально для идиотов укажу где: _IO_flockfile (fp);.

Ну и чтобы два раза не вставать, что там про fabs()?

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

rustonelove
()
Ответ на: комментарий от Virtuos86

Если ты считаешь себя программистом и не знаешь базовых основ ассемблера и С, ты — говно, а не программист!

А если к тому же не знаешь физики и матанализа, то говно в кубе!!!

anonymous
()
Ответ на: комментарий от rustonelove

Обосрался и сделал вид, что не в дерьме.

Вы учтите, Новодворская тоже плохо кончила. Это вредно вокруг думать, что все обосранные. Её то лечили, а вам повезло, карательная психиатрия умера вместе с Союзом и вы по своей молодости увы не застали.

_IO_flockfile (fp)

Которая взводит мутекс в структуре fp. Который в обсуждаемом треде не может быть заюзан через сискол, так как нет никаких тредов. Ну да не важно. Если вам так хочется тредовости, возмём для конкретного примера ferror_unlocked() — там где сисколы?

Ты уже обделался

Пф. Удивительно, вы до сих пор считаете что вы со своим «каждая функций зовёт сискол» не обделались? Какая занятная болезнь...

vodz ★★★★★
()
Ответ на: комментарий от Deleted

О функции, которая в линуксе завершается сисколлами!

Кстати, на микроконтроллерах я такой фигней не страдаю, и malloc'и-шмаллоки не использую, как и ртоси — не нужно оно там!

anonymous
()
Ответ на: комментарий от vodz

там где сисколы?

В данном случае тупо все на мьютексах работает. А вот если ты flock вызовешь, там уже без сисколла никак!

anonymous
()
Ответ на: комментарий от anonymous

крайне редкоотвечаю анонимусам, но это тот случай:

О функции, которая в линуксе завершается сисколлами!

вот ведь безграмотный долб@#п ;-) читайте уже матчасть...

MKuznetsov ★★★★★
()
Ответ на: комментарий от vodz

Вы учтите, Новодворская тоже плохо кончила. Это вредно вокруг думать, что все обосранные. Её то лечили, а вам повезло, карательная психиатрия умера вместе с Союзом и вы по своей молодости увы не застали.

Ещё раз, я знаю, ты знаешь, любой, кто что-то в теме понимает - так же это знает. Но ты продолжаешь делать вид, что ты несёшь не ахинею.

Которая взводит мутекс в структуре fp.

Мутекс - это сискол.

Который в обсуждаемом треде не может быть заюзан через сискол, так как нет никаких тредов.

Что за херню ты нанёс? Я бы понимаю, если бы ты начал юлить в сторону спинлока, а так ты обосрался.

Если вам так хочется тредовости, возмём для конкретного примера ferror_unlocked() — там где сисколы?

Зачем ты меняешь примеры после того, как обосрался?

Пф. Удивительно, вы до сих пор считаете что вы со своим «каждая функций зовёт сискол» не обделались? Какая занятная болезнь...

Уважаемая ламерюга, тебе уже сказали. Если ты хочешь кукарекать на тему «каждой функции» - отвечай мне на тему «каждой функции». Какого хрен, ты, балаболка, пытаешься съехать на левую тему? В данной ветке мы обсуждаем то, как ты обделался.

Хочешь кукарекать про «каждой функции» - отвечай на мой ответ выше по теме, создавая новую ветку.

Это юления от балаболов меня утомляют уже.

rustonelove
()
Ответ на: комментарий от MKuznetsov

Ты хочешь сказать, что mmap — не сисколл? А оперативку щедрой рукой Аллах пользователю по malloc отдает?

anonymous
()
Ответ на: комментарий от Deleted

Мы говорим о функции.

Интересно, а как с константным временем для malloc при фрагментации «кучи»? Не делать дефрагментацию? Кстати, если сисколы увязать с RT, то как раз malloc=sbrk и с фикцией для free() наоборот гораздо занятный вариант — памяти выделится всё доступное системе за константное время...

vodz ★★★★★
()
Ответ на: комментарий от anonymous

А вот если ты flock вызовешь, там уже без сисколла никак!

Причём тут flock? Да и вообще, вы бы видели КАК сделан был crypt() на старых юниксах. Оно делало fork()+exec(/lib/makecrypr)+sleep(1) чтобы «не подбирали пароли» — вот где пушной зверёк то был...

vodz ★★★★★
()
Ответ на: комментарий от vodz

Интересно, а как с константным временем для malloc при фрагментации «кучи»? Не делать дефрагментацию?

Что такое «дефрагментация» кучи? Она невозможна физически.

Если имеется в виду слияние соседних свободных блоков, то достаточно на каждом free() пытаться слить с одним предыдущим и одним следующим блоком. Это тоже O(1).

Deleted
()
Ответ на: комментарий от rustonelove

Мутекс - это сискол.

Ну да, Земля плоская, malloc - сискол. Уж не с последнего у вас тут подгорело? А?

Это юления от балаболов меня утомляют уже.

Так закройте зеркало тряпочкой, выпейти успокоину и поспите. Делов то.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Оно делало fork()+exec(/lib/makecrypr)+sleep(1) чтобы «не подбирали пароли» — вот где пушной зверёк то был...

o_O

Deleted
()
Ответ на: комментарий от Deleted

Что такое «дефрагментация» кучи? Она невозможна физически.

Если «физически», то это sbrk(-размер)/munmap()

Если имеется в виду слияние соседних свободных блоков, то достаточно на каждом free() пытаться слить с одним предыдущим и одним следующим блоком. Это тоже O(1).

Ну это ж не панацея. Выделили миллион по 16 байт, всё освободили, а потом запросили 64 байта... И обломаетесь.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.