C ++在指向char数组Pointer的指针上使用strcpy_s()

时间:2010-11-23 01:44:01

标签: c++ arrays char

我对自己感到困惑,但这就是我所拥有的。我最近才开始熟悉指针,更多的是我觉得使用它们更舒服,但是我收到的错误是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;
}

3 个答案:

答案 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