Страница 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
тут авторегистрация работает по некоторым дням - наверное от фазы луны зависит :roll:

Добавлено: 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-ины).
Введи и выбери сам документ из доступных.