Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> проблема с передачей указателя из функции, помогите, пожалуйста! очень срочно надо!
messsir
Вставить ник
сообщение 19:04:2008, 23:38
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 4
Регистрация: 19:04:2008
Пользователь №: 16 751



Репутация:   0  


писал программу и столкнулся с тем, что написанная функция для инициализации указателя не возвращает в точку вызова записанную по адресу строку.... никак не могу понять почему((( помогите, пожалуйста! заранее благодарен wink.gif
Прикрепленный файл  1.c ( 602 байт ) Кол-во скачиваний: 8
Подняться вверх 
 
Сообщение #1
 
Новая тема 
Ответов (1 - 3)
Yason
Вставить ник
сообщение 20:04:2008, 00:46
Цитата Ответить 


Продвинутый
Иконка группы

Группа: Программист
Сообщений: 141
Регистрация: 27:02:2004
Пользователь №: 296



Репутация:   6  


При вызове make_stroke(str), содержимое переменной str (а именно - неинициализированный мусор) копируется в стек. Функция make_stroke() получает это значение в виде локальной переменной new_stroke, и присваивает всяческие значения этой самой локальной переменной new_stroke. После того, как функция закончила свою работу, стек (содержащий переменную new_stroke) очищается, и значение new_stroke (указывающее на считанную строку) теряется.
Переменная str во всём этом деле участвовала только на этапе копирования её значения в стек.

Правильнее было бы одно из двух:
1) выделять память в main и передавать инициализированный указатель в функцию (а также размер выделенной памяти, чтобы следить за переполнением)
2) если действительно хочется, чтобы память выделялась по мере необходимости,
char* make_stroke(){
    char* new_stroke=(char *)malloc(2*sizeof(char));
    ...
    return (new_stroke);
}

int main(){
    char *str = make_stroke();
    ...
}


P.S. не забудьте free(str) wink.gif
Подняться вверх 
 
Сообщение #2
messsir
Вставить ник
сообщение 20:04:2008, 05:29
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 4
Регистрация: 19:04:2008
Пользователь №: 16 751



Репутация:   0  


большое спасибо за помощь! разобрался wink.gif
Подняться вверх 
 
Сообщение #3
biz
Вставить ник
сообщение 22:04:2008, 04:39
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 45
Регистрация: 15:04:2008
Пользователь №: 16 634



Репутация:   0  


#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>

void make_stroke( char **new_stroke )
{
    char    buff[256];
    scanf( "%s", buff );
    *new_stroke = (char *)malloc( strlen( buff ) * sizeof( char ) + 1 );
    strcpy( *new_stroke, buff );
}

void main( void )
{
    char *    str;
    printf( "please, enter: " );
    make_stroke( &str );
    printf( "\n%s", str );
    fflush( stdout );
    getch();
}


так мне кажется попроще будет!!...
Подняться вверх 
 
Сообщение #4


Быстрый ответ  Ответить  Новая тема 

> Быстрый ответ
Полужирный
Курсив
Подчеркнутый
Вставить изображение
Смайлики
Цитата
Код
 
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись |  AJAX?
   

 

RSS Текстовая версия Сейчас: 12:10:2008 - 05:20

с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net