c - Assigning a string to a pointer in a struct -


#include <stdio.h> #include <stdlib.h> #include <string.h>  struct person {         char *forename;         char *surname;         int age; };  void change_struct(struct person *person, char *forename, char *surname,                 int age); void print_struct(struct person *person);  int main(void) {         struct person person1;         person1.forename = malloc((strlen("max") + 1) * sizeof(char));         if (!person1.forename) {                 exit(exit_failure);         }         strcpy(person1.forename, "max");         person1.surname = malloc((strlen("mustermann") + 1) * sizeof(char));         if (!person1.surname) {                 exit(exit_failure);         }         strcpy(person1.surname, "mustermann");         person1.age = 35;          print_struct(&person1);          change_struct(&person1, "hans", "bauer", 45);          print_struct(&person1);          free(person1.forename);         free(person1.surname);          exit(exit_success); }  void change_struct(struct person *person, char *forename, char *surname,                 int age) {         person->forename = realloc(person->forename,                                    (strlen(forename) + 1) * sizeof(char));         if (!person->forename) {                 exit(exit_failure);         }         strcpy(person->forename, forename);         person->surname = realloc(person->surname,                                   (strlen(surname) + 1) * sizeof(char));         if (!person->surname) {                 exit(exit_failure);         }         strcpy(person->surname, surname);         person->age = age; }  void print_struct(struct person *person) {         printf("%s\n", person->forename);         printf("%s\n", person->surname);         printf("%d\n", person->age); } 

when assigning string pointer in struct well-defined behaviour if do

person1.forename = "max"; person1.surname = "mustermann"; 

in main() instead of using malloc() , strcpy()?

note: (of course in specific case need change realloc() calls in change_struct() since undefined behaviour when realloc() receives non- malloc(), calloc(), or realloc() created pointer.)

if dynamic memory allocation should required give explanation why?

as long don't want modify contents,

person1.forename = "max"; person1.surname = "mustermann"; 

are valid.

in case, person1.forename pointer string literal , attempt modify contents result in undefined behaviour.

that said,

  1. for print_struct() function, don't need pass pointer structure.
  2. sizeof(char) guaranteed produce 1 in c. using multiplication (to size in malloc())is redundant, can omitted easily.

Comments

Popular posts from this blog

Android : Making Listview full screen -

javascript - Parse JSON from the body of the POST -

javascript - Chrome Extension: Interacting with iframe embedded within popup -