Статьи Галерея Форум Чат Файлы HowTo Ссылки Поиск
Текущее время: 17 сен 2019, 04:22




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 03 янв 2004, 18:02 
Си - передача аргументов по ссылке
Код:
#include <stdio.h>
#include <string.h>
void q1(char *a){
   strcat(a, "123");
}
void main(){
   char a[20];
   strcpy(a, "hello");
   printf("%s\n", a);
   q1(a);   //добавляем к строке "123"
   printf("%s\n", a);
}

//gcc 1.c && ./a.out
//hello
//hello123

как того же эффекта добиться (т.е. как должна выглядеть
функция q1), если строка a будет объявлена так:
char *a = "hello";
Пытался написать что-то вроде этого, но не работает:
Код:
#include <glib.h>
#include <stdio.h>
void q1(char *a){   //я так понял ошибка здесь - аргумент надо задать
         //по-другому, но как?
   a = g_strdup_printf("%s123", a);
}
main(){
   char *a = "hello";
   printf("%s\n", a);
   q1(a);
   printf("%s\n", a);
}

//gcc `pkg-config --cflags --libs glib-2.0` 1.c && ./a.out
//hello
//hello /*а надо hello123*/


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 03 янв 2004, 23:15 
Неотъемлемая часть форума
Аватара пользователя

У нас с: 25.07.2003
Сообщения: 623
Откуда: Minsk
вообще-то и printf("%s123", a) сработает... но обычно используют sprintf() для которого выделяют еще один буфер.. в котором и формируют конечную строку..

для сравки -- man sprinf

gl

_________________
Never touch the running program!!!


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 04 янв 2004, 00:53 
Интересующийся

У нас с: 03.12.2003
Сообщения: 42
Откуда: г.Минск
char *a="hello";

a = const char* - а его менять низя

sAm


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 04 янв 2004, 05:47 
Неотъемлемая часть форума

У нас с: 12.08.2003
Сообщения: 250
Дык сделай так:

Код:
#include <glib.h>
#include <stdio.h>

void q1(char **a)
{
        *a = g_strdup_printf("%s123", *a);
}

main()
{
        char *a = "hello";
        printf("%s\n", a);
        q1(&a);
        printf("%s\n", a);
}


А лучше всего так:

Код:
#include <glib.h>
#include <stdio.h>

char * q1(char *a)
{
        return g_strdup_printf("%s123", a);
}

main()
{
        char *a = "hello";
        printf("%s\n", a);
        a = q1(a);
        printf("%s\n", a);
}

[/code]


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
СообщениеДобавлено: 04 янв 2004, 11:12 
Интересующийся

У нас с: 03.12.2003
Сообщения: 42
Откуда: г.Минск
Да! для начала через указатель.

Оставте _а_ в покое, так его объявив, мы навечно даем ему это
значение

Для собственного просвещения, дайте ссылку где можно прочитать
сжато про bin формат под L

sAm


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 04 янв 2004, 18:17 
Спасибо, Алексей, это то что надо.


Вернуться к началу
  
Ответить с цитатой  
СообщениеДобавлено: 07 янв 2004, 09:03 
Маньяк
Аватара пользователя

У нас с: 24.08.2002
Сообщения: 170
Откуда: 9-й Отдел
manny21 писал(а):
как того же эффекта добиться (т.е. как должна выглядеть
функция q1), если строка a будет объявлена так:
char *a = "hello";


Таким образом ты определили a как _указатель_ на строку "hello" длиной в 5 символов. strcat() не проверяет границ массивов, поэтому возможны ошибки в работе. Правильнее было бы сделать через malloc() и sprintf().[/code]


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 08 янв 2004, 18:26 
Интересующийся

У нас с: 03.12.2003
Сообщения: 42
Откуда: г.Минск
Люди объясните плиз
Скомпилил, да работает, но правильно ли так делать

main()
{
char *a = "hello";
>>> где храниться "hello"
>>> сегмент данных (инициализированные переменные)
printf("%s\n", a);
a = q1(a);
>>> переопределили а, ну бог сним
>>> "hello" для нас потерян, или я ошибаюсь
printf("%s\n", a);
}

PS. Для собственного просвещения

sAm


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 08 янв 2004, 19:24 
Неотъемлемая часть форума
Аватара пользователя

У нас с: 30.08.2002
Сообщения: 2339
Откуда: Minsk
я бы сделал char a[] = "hello"; но почему я так делаю, уже не помню :)
что-то из области бессознательного


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 11 янв 2004, 15:22 
Неотъемлемая часть форума

У нас с: 12.08.2003
Сообщения: 250
Да "hello" практически потерян.
а теперь указывает навыделенный malloc()'ом блок


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 12 янв 2004, 19:20 
Интересующийся

У нас с: 19.08.2003
Сообщения: 65
Откуда: Anwerpen, Belgium / Belarus
mend0za писал(а):
я бы сделал char a[] = "hello"; но почему я так делаю, уже не помню :)
что-то из области бессознательного


Ну вообщето, тут смотря чего ждали. В случае char *a = "hello", будет 4 байта (32-ОС)
в стеке, а при char a[] = "hello" отбабахает из стека (если это не глобальное данное) размер под строку и скопирует туда эту строку, которая в обоих случаях все равно будет размещена в некот. секции под инициализированные данные. И если уж потом менять значение a на другую строку, то массив этот в стеке не совсем надо.


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 12 янв 2004, 23:34 
2 dimm_coder

char *a = "hello" или char [] = "hello"
результат один и тотже - 6 байт длина строки в

2Aleksey Kondratenko
про себя - было уже подумал что С начал забывать. :(

sAm


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 13 янв 2004, 10:48 
Anonymous писал(а):
2 dimm_coder

char *a = "hello" или char [] = "hello"
результат один и тотже - 6 байт длина строки в

sAm


Где будет 6 байт? В секциии инициализированных данных , где будет хранится эта строка - да будет 6 байт. Разговор был *не об этом*.
Повторяю.

1) char *a = "hello" - в стеке 4 байта для указателя на char (*a*) и инициализируется адресом строки "hello" в секции данных.
2) char a[] = "hello" - в стеке будет выделено 6 байт и скопирована строка "hello" из секции данных.

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

Можете проверить gcc с ключом -S и посмотреть сгенерированный код.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 13 янв 2004, 10:52 
Интересующийся

У нас с: 19.08.2003
Сообщения: 65
Откуда: Anwerpen, Belgium / Belarus
тут авторегистрация работает по некоторым дням - наверное от фазы луны зависит :roll:

_________________
www.xenomai.org


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 13 янв 2004, 12:27 
Неотъемлемая часть форума

У нас с: 12.08.2003
Сообщения: 250
Кроме этого, в случае "char *". Получаем указатель в .rodata.
Попытка напр. *a = 0 даст segfault.
В другом случае у нас копия строки, которую можно править.


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
[ All resources are available under GNU GPL ] [ Support ] [ Hosted by DataHata | MyCloud.by ] [ Powered by phpBB® Forum Software © phpBB Group ]

LVEE Winter LVEE Rambler's Top100