2014-02-10 4 views
-4

У меня есть вопрос о следующей программе: Он печатает:Что мне делать, чтобы исправить эту программу?

DST-> вал в f1 = 6

dst.val в основной = -528993792

Я хочу исправить эту программу таким образом, он будет печатать

dst.val в основной = 6

Как это сделать?

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

typedef struct my_struct myStruct; 
struct my_struct 
{ 
    int val; 
}; 

myStruct *f2(void) 
{ 
    myStruct *dst = malloc(sizeof(myStruct)); 
    dst->val = 6; 
    return dst; 
} 



void f1(myStruct *dst) 
{ 
    dst = f2(); 
    printf("**dst->val in f1=%d\n", dst->val); 
} 


int main() 
{ 
    myStruct dst; 
    f1(&dst); 
    printf("**dst.val in main=%d\n", dst.val); 
} 
+0

Было бы страшно, если бы вы могли изменить адрес объекта, выделенного автоматически. Тем не менее, приятно, что вы не набрасываете возвращаемое значение 'malloc()'. –

+0

выглядит как домашнее задание ... – thang

ответ

0
void f1(myStruct *dst){ 
    myStruct *p = f2(); 
    printf("**dst->val in f1=%d\n", p->val); 
         //dst is the address that was copied on the stack. 
    dst->val = p->val;//There is no meaning If you do not change the contents. 
    free(p); 
} 
+0

[Добавить объяснения] (http://meta.stackexchange.com/q/148272/237804)? – anatolyg

+0

@anatolyg Вам нужно объяснение? – BLUEPIXY

+0

Нет, мне это действительно не нужно (возможно, другие) – anatolyg

0

Верните свою структуру по значению; не использовать указатели и динамическое распределение:

myStruct f2(void) 
{ 
    myStruct dst; 
    dst.val = 6; 
    return dst; 
} 

Тогда f1 будет использовать передачу по указателю понятие более традиционно:

void f1(myStruct *dst) 
{ 
    *dst = f2(); 
    printf("**dst->val in f1=%d\n", dst->val); 
} 

(на самом деле, я не уверен, если это называется «Pass- «по указателю» или «пересылка по ссылке», вероятно, последнее верно)

Смежные вопросы