Страница 1 из 2
Си - передача аргументов по ссылке
Добавлено: 03 янв 2004, 18:02
Anonymous
Си - передача аргументов по ссылке
Код: Выделить всё
#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
fa3a
вообще-то и printf("%s123", a) сработает... но обычно используют sprintf() для которого выделяют еще один буфер.. в котором и формируют конечную строку..
для сравки -- man sprinf
gl
Добавлено: 04 янв 2004, 00:53
sAm
char *a="hello";
a = const char* - а его менять низя
sAm
Передача аргументов через указатель
Добавлено: 04 янв 2004, 11:12
sAm
Да! для начала через указатель.
Оставте _а_ в покое, так его объявив, мы навечно даем ему это
значение
Для собственного просвещения, дайте ссылку где можно прочитать
сжато про bin формат под L
sAm
Добавлено: 04 янв 2004, 18:17
Anonymous
Спасибо, Алексей, это то что надо.
Re: Си - передача аргументов по ссылке
Добавлено: 07 янв 2004, 09:03
kostaLom
manny21 писал(а):
как того же эффекта добиться (т.е. как должна выглядеть
функция q1), если строка a будет объявлена так:
char *a = "hello";
Таким образом ты определили a как _указатель_ на строку "hello" длиной в 5 символов. strcat() не проверяет границ массивов, поэтому возможны ошибки в работе. Правильнее было бы сделать через malloc() и sprintf().[/code]
Добавлено: 08 янв 2004, 18:26
sAm
Люди объясните плиз
Скомпилил, да работает, но правильно ли так делать
main()
{
char *a = "hello";
>>> где храниться "hello"
>>> сегмент данных (инициализированные переменные)
printf("%s\n", a);
a = q1(a);
>>> переопределили а, ну бог сним
>>> "hello" для нас потерян, или я ошибаюсь
printf("%s\n", a);
}
PS. Для собственного просвещения
sAm
Добавлено: 08 янв 2004, 19:24
mend0za
я бы сделал char a[] = "hello"; но почему я так делаю, уже не помню

что-то из области бессознательного
Добавлено: 12 янв 2004, 19:20
dimm_coder
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
dimm_coder
тут авторегистрация работает по некоторым дням - наверное от фазы луны зависит

Добавлено: 13 янв 2004, 12:38
dimm_coder
Aleksey Kondratenko писал(а):
В другом случае у нас копия строки, которую можно править.
ну вот только не очень то с этого пользы много, размер то фиксирован под длину этой строки и больше быть не может. Лучше уже если менять, то заранее задавать размер буфера - char *a[max_possible] = "hello".
Хотя все зависит от того как и для чего должно использоваться a.
Добавлено: 13 янв 2004, 18:06
Гость
Люди где можно прочитать про формат выполняемоемого файла
под лин
За инфу спасибо.
sAm
Добавлено: 13 янв 2004, 18:13
dimm_coder
Google в помощь
вот на "ELF file format"
например получаем целую кучу сслылок ценных (даже pdf-ины).
Введи и выбери сам документ из доступных.