The OpenNET Project / Index page

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



Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Строковые типы в C, noisebringer (ok), 24-Июн-14, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


35. "Строковые типы в C"  +/
Сообщение от pavlinux (ok), 30-Июн-14, 17:05 
> Нашел для себя отличие между вариантами 4 и 6.
> Вариант 4 компилятор не дает использовать внутри функций.

Чёй-то вдруг?

char lala[4];
memset(lala, 0, sizeof(lala)/sizeof(lala[0]));

По-стандарту - массив не инициализированный, по-gcc - там нули.
и даже printf отработает нормально.

Ответить | Правка | Наверх | Cообщить модератору

36. "Строковые типы в C"  +/
Сообщение от noisebringer (ok), 30-Июн-14, 17:11 
warning: function returns address of local variable

Это говорит компилятор примерно в таком случае:

char *f() {
char lala[10];
return lala;
}

int main() {
printf("%s", f());
return 0;
}

Ответить | Правка | Наверх | Cообщить модератору

37. "Строковые типы в C"  +/
Сообщение от pavlinux (ok), 30-Июн-14, 18:53 
> warning: function returns address of local variable

Ну правильно - в ресторан со своими напитками нельзя!
Либо тут покупай, либо не занимай столик.

> Это говорит компилятор примерно в таком случае:
> char *f() {
>  char lala[10];
>  return lala;
> }
> int main() {
>  printf("%s", f());
>  return 0;
> }

Надо как "настоящие" кодеры - объявить lala[10] как глобальную переменную :)
<offtop> Первый признак - чем больше глобальных переменных, тем дол..ёбистей программер :)</offtop>


char lala[10];
char *f() {
       return lala;
}
int main() {
     return printf("%s", f());
}

Ответить | Правка | Наверх | Cообщить модератору

38. "Строковые типы в C"  +/
Сообщение от noisebringer (ok), 30-Июн-14, 20:27 
Меня только одно беспокоит.
Для того чтобы функция могла возвращать указатель, нужно чтобы в ней делался alloc какого-то количества памяти. А если делается alloc, то его нужно free. А если перед окончанием функции сделать его free, то, по идее, это значит что память где хранится результат и куда в дальнейшем будет ссылаться основной код как бы free и в любой момент может быть потерта.
Но если не в конце функции, то где делать это free.

P.S. Спасибо за лестное замечание. На данный момент глобальные переменные отсутствуют :)

Ответить | Правка | Наверх | Cообщить модератору

39. "Строковые типы в C"  +/
Сообщение от Аноним (-), 30-Июн-14, 20:43 
> Меня только одно беспокоит.

Твой доктор беспокоится ещё больше. Он уже произносил "мы его теряем! " ....

> Для того чтобы функция могла возвращать указатель, нужно чтобы в ней делался
> alloc какого-то количества памяти.

Похоже зря твой доктор волнуется. Мы тебя уже потеряли, спи спокойно моск noisebringer'a ...


Ответить | Правка | Наверх | Cообщить модератору

40. "Строковые типы в C"  +/
Сообщение от noisebringer (ok), 30-Июн-14, 20:51 
А вот тут не понял. Чтобы функция могла вернуть ссылку на какую-то область памяти, и в этой области памяти что-то лежало, то нужно сначала выделить эту область, потом сложить туда что-то. А потом вернуть ссылку на эту область.

Но если делается alloc, то где-то должен делаться free. Где?

Ответить | Правка | Наверх | Cообщить модератору

41. "Строковые типы в C"  +/
Сообщение от pavlinux (ok), 01-Июл-14, 02:35 
> А вот тут не понял. Чтобы функция могла вернуть ссылку на какую-то
> область памяти, и в этой области памяти что-то лежало, то нужно
> сначала выделить эту область, потом сложить туда что-то. А потом вернуть
> ссылку на эту область.
> Но если делается alloc, то где-то должен делаться free. Где?

char *myfunc() { /* тут объявили, адрес ужо есть */
   char *lala = (char *)malloc(10);
   return lala;
}

// Чо происходит?!: *myfunc указывает на lala, *lala на 10-байтный кусок.

void main() {

   char *dudu = myfunc();  // dudu -> myfunc -> lala -> 10;
   free(dudu);  //
}

Отседа вывод - можно сделать даже так:

void main() {
   free(myfunc());
}

Ответить | Правка | Наверх | Cообщить модератору

42. "Строковые типы в C"  +/
Сообщение от noisebringer (ok), 01-Июл-14, 05:46 
Так я и предполагал, так я и сделал :)
Указатели на функции. Видел краем глаза, но пока возиться не охото, но они быстрее говорять.
Ответить | Правка | Наверх | Cообщить модератору

43. "Строковые типы в C"  +/
Сообщение от noisebringer (ok), 01-Июл-14, 09:38 
Ой. Перепутал :) Не указатель на функцию :)
В общем идею уяснил :)
Ответить | Правка | Наверх | Cообщить модератору

44. "Строковые типы в C"  +/
Сообщение от pavlinux (ok), 01-Июл-14, 21:04 
> Указатели на функции.

Тоже можно, но через ж...у


char *myfunc() {
        char *lala = (char *)malloc(10);
        return lala;
}

void main() {

        char* (*dudu)() = myfunc;
        (*dudu)();
        free(dudu);
}


Ответить | Правка | К родителю #42 | Наверх | Cообщить модератору

45. "Строковые типы в C"  +/
Сообщение от Andrey Mitrofanov (?), 02-Июл-14, 10:02 
>         free(dudu);

malloc(sizeof) + memcpy забыл для полного комплекта. </code review>

Ответить | Правка | Наверх | Cообщить модератору

46. "Строковые типы в C"  +/
Сообщение от noisebringer (ok), 02-Июл-14, 12:19 
Насколько я знаю это не через ж**у, а так быстрее работать будет. Указатели на функции вроде как быстрее.
Ответить | Правка | К родителю #44 | Наверх | Cообщить модератору

47. "Строковые типы в C"  +/
Сообщение от pavlinux (ok), 02-Июл-14, 14:45 
>  вроде как быстрее.

Как быстрее, это уже следующий уровень, после K&R
Затем: Как меньше.
Потом: Как меньше и быстрее.
И последний: А ну вас в ж...у, все равно никто не оплачивает. Ушел на C++/PHP/HTML/QT/JS/...

Ответить | Правка | Наверх | Cообщить модератору

48. "Строковые типы в C"  +/
Сообщение от noisebringer (ok), 02-Июл-14, 19:41 
K&R?
Ответить | Правка | Наверх | Cообщить модератору

50. "Строковые типы в C"  +/
Сообщение от anonymous (??), 03-Июл-14, 00:32 
> Насколько я знаю это не через ж**у, а так быстрее работать будет.
> Указатели на функции вроде как быстрее.

Да-да, послушай идиотов. Его free(dudu) равнозначен free(myfunc), что являет собой адрес функции, который с динамической памятью связан чуть менее, чем никак. И покажи мне того полудурка, который что-то сказал о "быстрее" и "указатели на функции". Вся ветка вообще бред немыслимый, беги отсюда пока таким же не стал, мой тебе совет.

Ответить | Правка | К родителю #46 | Наверх | Cообщить модератору

51. "Строковые типы в C"  +/
Сообщение от pavlinux (ok), 03-Июл-14, 02:00 
>> Насколько я знаю это не через ж**у, а так быстрее работать будет.
>> Указатели на функции вроде как быстрее.
> Да-да, послушай идиотов. Его free(dudu) равнозначен free(myfunc),

Ты всех авторов ядра назвал лохами!
На изучай, только как школу закончишь:  https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux....

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

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

> И покажи мне того полудурка, который что-то сказал о "быстрее" и "указатели
> на функции". Вся ветка вообще бред немыслимый, беги отсюда пока таким
> же не стал, мой тебе совет.

Толсто

Ответить | Правка | Наверх | Cообщить модератору

53. "Строковые типы в C"  +/
Сообщение от Andrey Mitrofanov (?), 03-Июл-14, 09:24 
>>Его free(dudu) равнозначен free(myfunc),
> Ты всех авторов ядра назвал лохами!
> На изучай, только как школу закончишь:  torvalds/linux.git/tree/mm/slab.c
> Толсто
Ответить | Правка | К родителю #51 | Наверх | Cообщить модератору

54. "Строковые типы в C"  +/
Сообщение от anonymous2 (?), 03-Июл-14, 20:18 
Собери свой выхлоп, прочитай ради приличия выхлоп компилятора, запусти полученный бинарник.
Запустил? Теперь забейся в угол и рыдай, бессмысленный бот.
Ответить | Правка | К родителю #51 | Наверх | Cообщить модератору

55. "Строковые типы в C"  +/
Сообщение от pavlinux (ok), 04-Июл-14, 02:40 
> Собери свой выхлоп, прочитай ради приличия выхлоп компилятора,

Пффф... придумал тоже. У меня тут целый зоопарк кодеров за меня это делает.

Ответить | Правка | К родителю #54 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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