Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как убрать ошибки? 
V
    Опции темы
arth
Дата 5.6.2011, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.6.2011

Репутация: нет
Всего: нет



Код

#include <stdio.h>
#include <string.h>
void f(char *a){sprintf(a,"%s","second");}
int main(void)
{
char k[80]="first";
f(&k);
printf("%s\n",k);
  return 0;
}

gcc -Wall -o 1 1.c
1.c: In function ‘main’:
1.c:7:1: warning: passing argument 1 of ‘f’ from incompatible pointer type
1.c:3:6: note: expected ‘char *’ but argument is of type ‘char (*)[80]’
Сборка прошла успешно.

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

Что странно, я думал, что правильнее так:
Код

void f(char **a){sprintf(a,"%s","second");}

И даже так программа работает, но компилятор выкидывает:

gcc -Wall -o "Без имени" "Без имени.c" (в каталоге: .)
Без имени.c: In function ‘f’:
Без имени.c:3:1: warning: passing argument 1 of ‘sprintf’ from incompatible pointer type
/usr/include/stdio.h:361:12: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
Без имени.c: In function ‘main’:
Без имени.c:7:1: warning: passing argument 1 of ‘f’ from incompatible pointer type
Без имени.c:3:6: note: expected ‘char **’ but argument is of type ‘char (*)[80]’
Сборка прошла успешно.
и опять все работает...

а при
Код
void f(char **a){sprintf(*a,"%s","second");}

gcc -Wall -o "Без имени" "Без имени.c" (в каталоге: .)
Без имени.c: In function ‘main’:
Без имени.c:7:1: warning: passing argument 1 of ‘f’ from incompatible pointer type
Без имени.c:3:6: note: expected ‘char **’ but argument is of type ‘char (*)[80]’
Сборка прошла успешно.

но тут в Рантайм выдает ошибку "Segmentation fault"

Великие гуру) разъясните, пожалуйста, что тут к чему...

PM MAIL   Вверх
maint
Дата 5.6.2011, 14:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 12.5.2008

Репутация: 1
Всего: 2



правильно или
Код

f(k)

или 
Код

f[&k[0]);


PM   Вверх
arth
Дата 5.6.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.6.2011

Репутация: нет
Всего: нет



Цитата(maint @ 5.6.2011,  14:45)
правильно
Код

f(&k[0]);

Спасибо) точняк, второй вариант мне подходит...

а как должна выглядеть функция?
Код
void f(char *a){sprintf(a,"%s","second");}

или    
Код
void f(char **a){sprintf(a,"%s","second");}

?

просто я не пойму, строка в моем понимании это char*, тогда указатель на строку ведь должен быть char** ?

Это сообщение отредактировал(а) arth - 5.6.2011, 14:55
PM MAIL   Вверх
maint
Дата 5.6.2011, 15:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 12.5.2008

Репутация: 1
Всего: 2



строка это последовательность байт, ограниченная  символом '\0'. *a - ссылка на строку. **a - ссылка на массив строк. Т.е в данном случае f(char *) - ее описание для передачи строки в качестве параметра. Второй вариант, это просто длинно написанный первый.

Это сообщение отредактировал(а) maint - 5.6.2011, 15:16
PM   Вверх
arth
Дата 5.6.2011, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.6.2011

Репутация: нет
Всего: нет



Цитата(maint @ 5.6.2011,  15:15)
Второй вариант, это просто длинно написанный первый.

если вы про f(k) и f(&k[0]) то...
Млин, я почему-то был уверен, что f(k) обязательно будет работать с копией строки... 
Какая нафиг копия массива)
Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1369 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.