#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(),创建指针)
如果需要动态内存分配,你可以解释一下原因吗?
只要你不想修改内容,
person1.forename = "Max";
person1.surname = "Mustermann";
Run Code Online (Sandbox Code Playgroud)
完全有效.
在这种情况下,person1.forename将是一个指向字符串文字的指针,任何修改内容的尝试都将导致未定义的行为.
那说,
print_struct()函数,您不需要将指针传递给结构.sizeof(char)是保证产生1在C.使用它进行乘法(得到大小malloc())是多余的,可以很容易地省略.