【问题标题】:C++ using strcpy_s() on a Pointer to char array PointerC++ 在指向字符数组指针的指针上使用 strcpy_s()
【发布时间】:2010-11-23 01:44:00
【问题描述】:

我到了让自己感到困惑的地步,但这就是我所拥有的。我最近才开始熟悉指针,直到我觉得使用它们更舒服,但我收到一个错误,提示 strcpy_s() 中的缓冲区太小。

请不要对我使用 char 数组而不是 std::string 来介绍我,它用于 HL2SDK,它以 char 数组为中心(不知道为什么),所以我只是坚持这个模式。

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;
}

【问题讨论】:

  • 如果您需要动态分配的char 数组,通常可以使用std::vector<char>。我不明白为什么这在这里行不通。
  • 为什么要新建和删除刚刚在堆栈上声明就可以完美完成的字符缓冲区?

标签: c++ arrays char


【解决方案1】:

问题是您使用的是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);
}

【讨论】:

  • “用于确定运行时长度的编译时构造”——这不是矛盾吗?
  • @Alex 它是,因此原始解决方案失败的原因:)
【解决方案2】:

如果您使用常量值 (char *szGroupID = new char[64]) 为什么不声明一个值为 64 的常量并使用该值;顺便说一下 sizeof(szGroupID) 在 32 位编译器中也将返回 4 个字节。

【讨论】:

    【解决方案3】:

    strcpy_s 的第二个参数是第一个参数指向的缓冲区的实际大小(字符数)。 sizeof(*communityID) 只为您提供char * 指针的大小,在 32 位系统上通常为 4 个字节。您需要将*communityID 的实际大小传递给GetGroupCommunityID 函数并将其传递给strcpy_s

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      相关资源
      最近更新 更多