c - 如何正确分配新的字符串值?

标签 c string struct strcpy

我试图了解如何以最干净/最安全的方式用 C 解决这个小问题。这是我的例子:

#include <stdio.h>

int main(int argc, char *argv[])
{
    typedef struct
    {
        char name[20];
        char surname[20];
        int unsigned age;
    } person;

    // Here I can pass strings as values...how does it work?
    person p = {"John", "Doe", 30};

    printf("Name: %s; Age: %d\n", p.name, p.age);

    // This works as expected...
    p.age = 25;

    //...but the same approach doesn't work with a string
    p.name = "Jane";

    printf("Name: %s; Age: %d\n", p.name, p.age);

    return 1;
}

编译器的错误是:

main.c: In function ‘main’: main.c:18: error: incompatible types when assigning to type ‘char[20]’ from type ‘char *’

我知道 C(不是 C++)没有 String 类型,而是使用 char 数组s,因此另一种方法是更改​​示例结构以保存 char 的指针s:

#include <stdio.h>

int main(int argc, char *argv[])
{
    typedef struct
    {
        char *name;
        char *surname;
        int unsigned age;
    } person;

    person p = {"John", "Doe", 30};

    printf("Name: %s; Age: %d\n", p.name, p.age);

    p.age = 25;

    p.name = "Jane";

    printf("Name: %s; Age: %d\n", p.name, p.age);

    return 1;
}

这按预期工作,但我想知道是否有更好的方法来做到这一点。

最佳答案

第一个示例不起作用,因为您无法将值分配给数组 - 在这方面,数组的工作方式(有点)类似于 const 指针。您可以做的是将新值复制到数组中:

strcpy(p.name, "Jane");

如果您事先知道字符串的最大大小,则可以使用 Char 数组,例如在第一个示例中,您 100% 确定该名称适合 19 个字符(不是 20 个字符,因为始终需要一个字符来存储终止零值)。

相反,如果您不知道字符串可能的最大大小,和/或您想优化内存使用,例如,指针会更好。避免为名称“John”保留 512 个字符。但是,使用指针,您需要动态分配它们指向的缓冲区,并在不再需要时释放它,以避免内存泄漏。

更新:动态分配缓冲区的示例(使用第二个示例中的结构定义):

char* firstName = "Johnnie";
char* surname = "B. Goode";
person p;

p.name = malloc(strlen(firstName) + 1);
p.surname = malloc(strlen(surname) + 1);

p.age = 25;
strcpy(p.name, firstName);
strcpy(p.surname, surname);

printf("Name: %s; Age: %d\n",p.name,p.age);

free(p.surname);
free(p.name);

关于c - 如何正确分配新的字符串值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53426187/

相关文章:

c - 同时运行两个无限进程

algorithm - 一个类似于 Levenshtein 但针对 Qwerty 键盘加权的好算法?

Java 字符串缓冲区

c - 我可以假设结构字段按顺序放置并且没有填充吗?

ios - 如何使用带有可变键的 codable 解码 JSON?

c - 隐式函数声明和链接

c++ - 函数调用顺序

c - 套接字系列函数如何处理不同类型的结构?

c - GPU 上是否有内存保护

java - 需要一些关于 java 中扫描仪生成的字符串中空格的指导