• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

проблема с передачей указателя из функции

  • Автор темы messsir
  • Дата начала
M

messsir

писал программу и столкнулся с тем, что написанная функция для инициализации указателя не возвращает в точку вызова записанную по адресу строку.... никак не могу понять почему((( помогите, пожалуйста! заранее благодарен :angry:
Посмотреть вложение 1.c
 
Y

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) :angry:
 
M

messsir

большое спасибо за помощь! разобрался :angry:
 
B

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();
}

так мне кажется попроще будет!!...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!