C ++ с использованием strcpy_s () в Pointer to char массив Pointer - PullRequest
2 голосов
/ 23 ноября 2010

Я до такой степени, что запутываю себя, но вот что у меня есть.Я только недавно начал больше знакомиться с указателями, и я чувствую себя более комфортно при их использовании, но я получаю сообщение о том, что буфер в 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;
}

Ответы [ 3 ]

5 голосов
/ 23 ноября 2010

Проблема в том, что вы используете 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 голос
/ 23 ноября 2010

Если вы используете значения констант (char * szGroupID = new char [64]), почему бы не объявить константу со значением 64 и использовать это значение;кстати, sizeof (szGroupID) тоже собирается вернуть 4 байта в 32-битном компиляторе.

0 голосов
/ 23 ноября 2010

Второй параметр strcpy_s - это фактический размер (количество символов) буфера, на который указывает первый параметр.sizeof(*communityID) дает только размер указателя char *, обычно 4 байта в 32-разрядной системе.Вам необходимо передать фактический размер *communityID в функцию GetGroupCommunityID и передать его в strcpy_s.

...