#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 函数。