информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsАтака на InternetСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C] Выделение памяти из функции 14.09.03 07:43  
Автор: makeworld Статус: Member
<"чистая" ссылка>
тестовая прога:

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

#define TEST "test string"

struct struct1 {
	char *str;
};

struct struct2 {
	struct struct1 *stru;
};

void func(char *d, char *s) {
	d = (char *)malloc(strlen(s)+1);
	strncpy(d,s,strlen(s)+1);
}


void main() {
struct struct2 *s;

s = (struct2 *)malloc(sizeof(struct2));
s->stru = (struct1 *)malloc(sizeof(struct1));

if (!s|!s->stru) printf("malloc() error\n");

memset(s->stru,0,sizeof(struct1));

//s->stru->str = (char *)malloc(sizeof(TEST)); // работает!
//strncpy(s->stru->str,TEST,sizeof(TEST));
func(s->stru->str,TEST); // не работает! (s->stru->str после работы ф-ции равен NULL)

printf("str=%s\n",s->stru->str);

}

---

Почему в функции память не выделилась?
Использую VC++.NET (2002).
[C] Выделение памяти из функции 14.09.03 15:46  
Автор: Tlo Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> void func(char *d, char *s) {

А надо так:

void func(char *&d, char *s) {
[C] Выделение памяти из функции 15.09.03 07:37  
Автор: makeworld Статус: Member
<"чистая" ссылка>
> А надо так:
>
> void func(char *&d, char *s) {

спасибо. а почему именно так?
[C] Выделение памяти из функции 15.09.03 10:15  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 15.09.03 10:17  Количество правок: 1
<"чистая" ссылка>
> > А надо так:
> >
> > void func(char *&d, char *s) {
>
> спасибо. а почему именно так?

Можно еще void func( char **d, char *s);
Вызов, соответственно, func( &srtu...

Почему: передали функции указатель (не имеет смысла, если она его сразу "запарывает") в переменной d, ну изменила она этот параметр,присвоив то, что маллок вернул, указатель на строку в main не измениться. Указатель на строку в структуре в функции main она не изменит, потому, что не передался его адрес, передалось в функцию только его значение. Как изменить из вызываемой функции указатель - надо передать указатель на этот указатель.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach