将字符串分配给结构中的指针

lor*_*age 1 c string 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);
}
Run Code Online (Sandbox Code Playgroud)

将字符串分配给a中的指针时,struct如果我愿意的话,它是明确定义的行为

person1.forename = "Max";
person1.surname = "Mustermann";
Run Code Online (Sandbox Code Playgroud)

main()最初而不是使用malloc()strcpy()

注:(当然,在这种特定的情况下,我会还需要改变realloc()在调用change_struct(),因为它是在不确定的行为realloc()接收非malloc(),calloc()realloc(),创建指针)

如果需要动态内存分配,你可以解释一下原因吗?

Sou*_*osh 6

只要你不想修改内容,

person1.forename = "Max";
person1.surname = "Mustermann";
Run Code Online (Sandbox Code Playgroud)

完全有效.

在这种情况下,person1.forename将是一个指向字符串文字的指针,任何修改内容的尝试都将导致未定义的行为.

那说,

  1. 对于print_struct()函数,您不需要将指针传递给结构.
  2. sizeof(char)是保证产生1C.使用它进行乘法(得到大小malloc())是多余的,可以很容易地省略.