我对自己感到困惑,但这就是我所拥有的。我最近才开始熟悉指针,更多的是我觉得使用它们更舒服,但是我收到的错误是strcpy_s()中的缓冲区太小了。
请不要评论我使用char数组而不是std :: string,它用于以char数组为中心的HL2SDK(不知道为什么)所以我只是坚持这个模式。
void func_a()
{
char *szUserID = new char[64];
char *szInviterID = new char[64];
char *szGroupID = new char[64];
sprintf(szUserID, "%I64d", GetCommunityID(szUserSteamID));
sprintf(szInviterID, "%I64d", GetCommunityID(g_CvarSteamID.GetString()));
GetGroupCommunityID(1254745, &szGroupID); // Group Steam Community ID
}
void GetGroupCommunityID(int groupID, char **communityID)
{
int staticID = 1035827914;
int newGroupID = 29521408 + groupID;
char *buffer = new char[64];
snprintf(buffer, sizeof(buffer), "%d%d", staticID, newGroupID);
strcpy_s(*communityID, sizeof(*communityID), buffer);
delete buffer;
}
答案 0 :(得分:5)
问题是您正在使用sizeof
这是一个编译时构造来确定*communityID
的运行时长度。这基本上会解决为sizeof(char*)
。你想要的是*communityID
中可用的字节数/字符数。此信息需要与值
GetGroupCommunityID(1254745, &szGroupID, sizeof(szGroupID));
void GetGroupCommunityID(int groupId, char** communityID, size_t length) {
...
strcpy_s(*communityID, length, buffer);
}
同样在这个例子中,双指针是不必要的,因为你没有改变指针,只是它的内容。单个指针可以很好地用于
GetGroupCommunityID(1254745, szGroupID, sizeof(szGroupID));
void GetGroupCommunityID(int groupId, char* communityID, size_t length) {
...
strcpy_s(communityID, length, buffer);
}
答案 1 :(得分:1)
如果使用常量值(char * szGroupID = new char [64]),为什么不使用值64声明一个常量并使用该值;顺便说一句,sizeof(szGroupID)在32位编译器中也将返回4个字节。
答案 2 :(得分:0)
strcpy_s
的第二个参数是第一个参数指向的缓冲区的实际大小(字符数)。 sizeof(*communityID)
仅为您提供char *
指针的大小,通常是32位系统上的4个字节。您需要将*communityID
的实际大小传递给GetGroupCommunityID
函数,并将其传递给strcpy_s
。