2015-06-28 3 views
1

Я только что написал небольшую программу, чтобы играть со структурами. Эта программа отлично работает, но у меня мало сомнений в одном утверждении. Может кто-нибудь прояснить меня, пожалуйста?Передача структуры между функцией

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
struct mystr 
{ 
    int a; 
    float b; 
    char a1[10]; 
}; 
void fun(struct mystr *ptr1) 
{ 
    struct mystr *ptr; 
    ptr=malloc(sizeof(struct mystr)); 
    ptr->a=10; 
    ptr->b=1662.3456; 
    strcpy(ptr->a1,"xxxxxx"); 
    *ptr1=*ptr; /* <<<<<<<<<<<- This assignment is fine? */ 
    free(ptr); 
} 
void main() 
{ 
    struct mystr var1; 
    memset(&var1,0,sizeof(struct mystr)); 
    fun(&var1); 
    printf("my data is %4d,%10.3f,%5s\n",var1.a,var1.b,var1.a1); 
} 

Я знаю, что могу просто передать указатель на веселье и распечатать его бесплатно. Но я просто хотел, чтобы эта программа была таким образом (передавая адрес переменной структуры и заполняя ее). Спасибо заранее.

+0

Да, это - на самом деле, вы могли бы использовать ptr1 вместо PTR и не заморачиваться с таНос и свободной – cup

+0

всегда проверять (! = NULL) возвращаемого значения из таНос() и семейства функций. В противном случае любое разыменование возвращаемого значения приведет к доступу к адресам вокруг 0. Это неопределенное поведение и может/приведет к событию сбоя seg – user3629249

ответ

3

Это назначение

*ptr1=*ptr; /* <<<<<<<<<<<- This assignment is fine? */ 

прекрасно. Только нет смысла выделять динамически еще одну структуру, которая инициализирует исходную структуру. Вы могли бы написать функцию проще

void fun(struct mystr *ptr1) 
{ 
    ptr1->a = 1 0; 
    ptr1->b = 1 662.3456; 
    strcpy(ptr1->a1, "xxxxxx"); 
} 

Кроме того, вместо того, чтобы использовать MemSet после определения структуры объекта

struct mystr var1; 
memset(&var1,0,sizeof(struct mystr)); 

вы могли бы написать просто

struct mystr var1 = { 0 }; 

Примите во внимание, что функция основной в C должен следует объявить как

int main(void) 

По крайней мере, он должен иметь тип возврата int.

0

Опубликованная кода, эта строка:

*ptr1=*ptr; 

нонсенс.

Он не копирует содержимое двух структур.

чтобы скопировать содержимое, используйте memcpy (pDestination, pSource, numBytesToCopy);

I.E.

memcpy(ptr1, ptr, sizeof(struct mystr)); 
+0

'* ptr1 = * ptr;' ** ** действует до тех пор, пока 'ptr 'является указателем на меньшую структуру или равный размер структуры, на которую указывает' ptr1'. в этом случае они указывают на один и тот же тип. Таким образом, он действителен (хотя, очевидно, не нужен, memcpy также не нужен, см. Ответ @ vlad-from-Moscow). –

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