Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблема с передачей указателя из функции
Форум программистов > Системное программирование > C, С++ и С Builder > Общие вопросы по С и С++
messsir
писал программу и столкнулся с тем, что написанная функция для инициализации указателя не возвращает в точку вызова записанную по адресу строку.... никак не могу понять почему((( помогите, пожалуйста! заранее благодарен wink.gif
Нажмите для просмотра прикрепленного файла
Yason
При вызове 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
messsir
большое спасибо за помощь! разобрался wink.gif
biz
#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();
}


так мне кажется попроще будет!!...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.