这行代码怎么修改呢,为什么会报错呢


#include
int clen(const char* str)
{
    int i;
    for (int i = 0; str[i]; i++);
    return ++i;
}
char* cstr(const char* str)
{
    int len = clen(str);
    char* strRt = new char[len];
    memcpy(strRt, str, len);
    return strRt;
}
typedef struct Role
{
    char* Name;
    int   Hp;
    int   MaxHp;
    int   Mp;
    int   MaxMp;
    int   Lv;
}*PROLE, ROLE;
ROLE createMonster(const char* str,int Hp,int Mp)
{
    Role rt{ cstr(str), Hp, Hp, Mp, Mp, 1 };
    return rt;
}
int main()
{
    ROLE role = createMonster("abc", 1500, 1500);
    std::cout << role.Name << std::endl;
    std::cout << role.Hp << std::endl;

}

这行代码怎么修改呢,为什么会报错呢
我明明是照着别人抄的,为什么他的没错


int clen(const char* str)
{
    int i;
    for (i = 0; str[i]; i++);
    return ++i;
}

for循环里面多了个int ,导致你这个函数的返回值不对

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在这段代码中,结构体 Role 中的 Name 成员是一个指向 char 类型的指针,而在 createMonster 函数中,Name 的值是通过 cstr 函数返回的一个指向动态分配的 char 数组的指针。
-
问题在于,当 Role 结构体被创建并初始化后,在 createMonster 函数返回后,Name 指向的动态分配的内存将被释放,所以在访问 role.Name 时会出现未定义行为。这可能导致程序崩溃或显示意外结果。
-
为了解决这个问题,可以在 Role 结构体中使用一个字符数组来存储名称,而不是指向动态分配内存的指针。
修改后的代码示例:

#include<iostream>
#include<cstring>

typedef struct Role
{
    char Name[256];
    int Hp;
    int MaxHp;
    int Mp;
    int MaxMp;
    int Lv;
}*PROLE, ROLE;

ROLE createMonster(const char* str,int Hp,int Mp)
{
    Role rt{ {0}, Hp, Hp, Mp, Mp, 1 };
    strncpy(rt.Name, str, sizeof(rt.Name)-1);
    return rt;
}

int main()
{
    ROLE role = createMonster("abc", 1500, 1500);
    std::cout << role.Name << std::endl;
    std::cout << role.Hp << std::endl;
    return 0;
}


在这个修改后的代码中,Name 成员被定义为一个 256 字节大小的字符数组,最大允许的字符串长度为 255 个字符(为了留出一个字符位置放置终止符 '\0')。在 createMonster 函数中,使用 strncpy 函数将字符串复制到 Name 数组中,并确保最终复制的字符串以 '\0' 结尾。

另外,需要包含 头文件,以使用 strncpy 函数。