10 / 10 / 2
Регистрация: 26.02.2011
Сообщений: 69
1

Указатели Char, передача адреса в функцию

06.08.2013, 18:09. Показов 1310. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
в данном случае проблема выглядит следующим образом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
main(void)
{
   char *map, *moves;
   readFile(map, moves);
}
 
readFile(char *map, char *moves)
{
   map = (char*)malloc(over9000);
   moves = ... //тоже самое, что и выше
   //перед передачей в функцию по этим указателям находился мусор
   //после маллоков в map и moves по прежнему тот же мусор..как с этим бороться? 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2013, 18:09
Ответы с готовыми решениями:

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

Передача массива char в функцию
Пишу такой код //--------------------------------------------------------------------------- ...

Передача символа char в функцию
Господа, добрый день. Вопрос у меня очень простой, я бы сказал элементарный. Но в связи с запором...

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

9
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
06.08.2013, 18:11 2
C++
1
2
3
4
5
6
7
8
9
10
11
main(void)
{
   char *map, *moves;
   readFile( &map, &moves );
}
 
readFile(char **map, char **moves)
{
   *map = (char*)malloc(over9000);
   *moves = ...
}
1
10 / 10 / 2
Регистрация: 26.02.2011
Сообщений: 69
06.08.2013, 18:16  [ТС] 3
не работает, сегментейшн фолт
0
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
06.08.2013, 18:19 4
Цитата Сообщение от VIPerZ Посмотреть сообщение
я думал маллок выдает адрес куска памяти
А так и есть.
0
10 / 10 / 2
Регистрация: 26.02.2011
Сообщений: 69
06.08.2013, 18:34  [ТС] 5
Цитата Сообщение от castaway Посмотреть сообщение
А так и есть.
C
1
*map = (char*)malloc(w*h);
данная иструкция выделила почему-то неправильно кол-во памяти, в данном случае w=5, h=5 , а выделено было только кусок на 3 чара...
0
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
06.08.2013, 18:35 6
Цитата Сообщение от VIPerZ Посмотреть сообщение
в данном случае w=5, h=5 , а выделено было только кусок на 3 чара...
Такого не может быть. Скорее всего ты не правильно это проверяешь.
Покажи простой нерабочий пример.
0
10 / 10 / 2
Регистрация: 26.02.2011
Сообщений: 69
06.08.2013, 18:42  [ТС] 7
Цитата Сообщение от castaway Посмотреть сообщение
Такого не может быть. Скорее всего ты не правильно это проверяешь.
ну, не спорю, strlen() возвращает 0, а сегментейшн фолт вылетает, когда пытаюсь пройтись по массиву *map[i] = ...

можете подсказать, что я делаю не правильно?
0
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
06.08.2013, 18:45 8
Цитата Сообщение от VIPerZ Посмотреть сообщение
можете подсказать, что я делаю не правильно?
Ты не показываешь что делаешь.
Почему я должен гадать чем ты заполнил массив по указателю?
C++
1
2
3
4
    char * s;
    s = (char *)malloc( 13 + 1 ); // +1 для завершающего '\0'
    strcpy( s, "Hello, World!" );
    printf( "%s\n", s );
0
10 / 10 / 2
Регистрация: 26.02.2011
Сообщений: 69
06.08.2013, 19:01  [ТС] 9
Цитата Сообщение от castaway Посмотреть сообщение
Ты не показываешь что делаешь.
Спасибо, пример понятен, поэтому и не понятно, почему не работает моя конструкция.
Если обьявить свои char* внутри функции, то всё работает правильно.

А если так, то нет:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
main(void)
{
int w,h;
char *map;
readFile(&map, &w, &h);
}
 
void readFile(char **map, int* w, int *h)
{
int i = 0;
w = 5;
h = 5;
*map = (char*)malloc(w*h);
char ch;
while ((ch = fgetc(input))!=EOF)
{
*map[i] = ch;
if (i < w*h) ++i;
else goto err;
}
}
исключение вылетает на строчке *map[i] = ch;
причем, когда я пытался делать абсолютно то же самое, но с обьявлением char* внутри функции чтения файла, то всё работало...просто нужна допустность этого map из main

Добавлено через 3 минуты
разобрался, тут выражение *map[i] в неправильном (для меня) порядке разбиралось, как-то вроде *(map[i]).
Изменил (*map)[i] - теперь работает
Ещё раз спасибо
0
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
06.08.2013, 19:01 10
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
main(void)
{
int w,h;
char *map;
readFile(&map, &w, &h);
}
 
void readFile(char **map, int* w, int *h)
{
int i = 0;
*w = 5; // разименовываем
*h = 5; // разименовываем
*map = (char*)malloc( *w * *h );  // разименовываем
char ch;
while ((ch = fgetc(input))!=EOF)
{
(*map)[i] = ch; // указываем приоритет
if (i < *w * *h) ++i;  // разименовываем
else goto err;
}
}
1
06.08.2013, 19:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2013, 19:01
Помогаю со студенческими работами здесь

Указатели и адреса
Всем привет Подскажите, можно ли каким-то образом передать значение переменной i из одной...

Указатели char*. Принцип работы
Здравствуйте. пример: char *s1=&quot;Any1&quot;, s2=&quot;Any2&quot;; void string_copy(char *s1, char *s2) {...

Про char указатели, массивы и malloc
Если у меня есть функция, typedef struct CNS { char* title; int width; int height; }...

Передача в функцию char*([Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings])
Почему компилятор на это матерится? ObjA.Show(&quot;A&quot;); deprecated conversion from string constant...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru