char * 在一个结构中,指向一个 char 数组,然后使用 strncpy。试图避免动态分配的内存

标签 c pointers struct buffer dynamic-allocation

struct person
{
    char age [3];
    char * name;
};

char nameBuf[20];

person Natasha;
person * p_person;
p_person = &Natasha;

Natasha.name = nameBuf;

createPerson (person * resultingPerson, int p_age, const char * p_name)
{

    sprintf(resultingPerson->age, "%03d", p_age);

    strncpy(resultingPerson->name, p_name, strlen(p_name));
}


createPerson (p_person, 29, "Chelsea");

此代码在调用 strncpy 时失败。我不能使用动态分配的内存。处理这个问题的最佳方法是什么?为什么在 name* 指向 nameBuf[20] 字符数组然后使用 strncpy 后这不起作用?

谢谢

最佳答案

首先,年龄只有 3 岁,而您正试图写入 4 个字节的 3 位数字和一个空值。此外,通常您的 strncpy 长度参数是目标的大小减 1,以便您有空间添加空值(如果源字符串较短,strncpy 将添加空值)。

#define NAMEBUFSIZ 20
char namebuf[NAMEBUFSIZ];
typedef struct person
{
    char age [3];
    char *name;
} person;

person Natasha;
person * p_person;
p_person = &Natasha;
p_person->name = namebuf;

createPerson (person * resultingPerson, int p_age, const char * p_name)
{
    char tmpbuf[5];

    snprintf(tmpbuf, sizeof(tmpbuf), "%03d", p_age);
    memcpy(resultingPerson->age, tmpbuf, sizeof(resultingPerson->age));
    resultingPerson->name[NAMEBUFSIZ-1] = '\0';
    strncpy(resultingPerson->name, p_name, NAMEBUFSIZ-1);
}
createPerson (p_person, 29, "Chelsea");

但它仍然不干净。你能保证年龄是合理的,并且只传递短名称(19 个或更少的字符)吗?

注意:将 sprintf 更改为 snprintf,因为下面的评论是正确的,sprintf 非常不安全,正如您的代码示例所示

关于char * 在一个结构中,指向一个 char 数组,然后使用 strncpy。试图避免动态分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29054879/

相关文章:

c++ - 为什么结构的方法不必在 C++ 中声明?

go - 如何获取接口(interface)引用的对象的地址

c++ - 在 C++ 中转换函数指针的奇怪行为

C:按位非结构体

c - 临时文件与 malloc(在 C 中)

c - 从递归函数传递指针

C - 结构内的指针不影响代码

C - 2D 全局数组 -> 在大小 >4 时遇到段错误

关于 posix 管道与内核 fd 表的混淆

c - 排序数组的前 n 个元素