@TyGGer4ik

Компилятор выдаёт ошибку при попытке вызвать sizeof() относительно моего массива. Как исправить ошибку?

Мне необходимо было измерить длину моего массива (кол-во элементов) и я решил поделить размер массива (sizeof(массив)) на (sizeof(тип элемента массива)), но компилятор выдаёт ошибку.

int one_symb_diff(const char *s1, const char *s2)
{
    int len = strlen(s1);
    int diff_n = 0;
    for (size_t i = 0; i < len; i++)
    {
        if (s1[i] != s2[i]) diff_n ++; 
    }
    if(diff_n == 1) return 1;
    else return 0;
}

int word_chain(const char *s1, const char *s2, const char *dict[])
{
    for (size_t i = 0; i < sizeof(dict)/sizeof(const char); i++)
    {
        if ((one_symb_diff(dict[i], s1)) * (one_symb_diff(dict[i], s2))) return i;
    }
    return -1; // заменить 0 на ответ
}


‘sizeof’ on array function parameter ‘dict’ will return size of ‘const char **’ [-Wsizeof-array-argument]
   17 |     for (size_t i = 0; i < sizeof(dict)/sizeof(const char); i++)
      |                                  ^
  • Вопрос задан
  • 81 просмотр
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
В C параметр функции не может быть массивом, только указателем. Синтаксис "имя с квадратными скобками" несёт тот же смысл, что и "имя со звёздочкой" когда речь идёт о параметрах функции. Если внутри функции взять sizeof от такого параметра результат будет равен sizeof от указателя. Это очень распространённая ошибка и компилятор говорит тебе об этом. Если тебе нужен размер массива переданного в функцию -- передавай его отдельно, например отдельным параметром.

sizeof(dict)/sizeof(const char)

Здесь ещё одна ошибка: dict -- это массив указателей (на самом деле указатель на такой массив, но по крайней мере, ты ожидал массив указателей), но ты делишь размер массива на размер const char а не на размер const char *. Во избежание таких ошибок для вычисления размера массива обычно пишут sizeof(dict)/sizeof(dict[0]).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы