Указатели в C и кастинг - PullRequest
1 голос
/ 05 марта 2020

На этот раз я начал изучать указатели. Я пытаюсь прочитать байты из этого массива. Задача почти выполнена, но CLang keep предупреждает меня с предупреждением, которого я не понимаю. Вот мой код Предупреждение говорит: «Аргумент вызова функции является неинициализированным значением»

int main(void)
{
    int tab[] = {67305985,134678021,202050057};
    int *pp=0;
    pp=tab;

    char *wsk=(char*)pp;

    for (int i = 0; i < 12; i++)
    {
        if((wsk+i)!=(void*)NULL)
            printf("%d ",*(wsk+i));    // warning on this line
        else
            return 0;
    }

}

Ответы [ 3 ]

5 голосов
/ 05 марта 2020

Эти предупреждения получены от Clang Stati c Analyzer (или как они это называют в наши дни).

Для меня это выглядит как ложный положительный результат, если предположить, что int - это по крайней мере 4 байта, а реальный код имеет #include <stdio.h> и никаких других изменений.

Если вы используете последнюю версию анализатора, вы можете отправить отчет об ошибке лягушки. Ну, вы могли бы, если бы они позволили людям, у которых еще нет аккаунтов, отправлять отчеты об ошибках. Возможно, кто-то другой, читающий эту ветку, сможет это сделать.

Примечание: это помогло бы задать вопрос о том, какую именно версию анализатора вы используете (это может отличаться от компилятора, который вы используете для сборки - некоторые IDE для компиляции используют другие компиляторы, чем для этих встроенные сообщения).

1 голос
/ 05 марта 2020

Это если утверждение

if((wsk+i)!=(void*)NULL)

не имеет смысла. Макрос NULL уже является константой нулевого указателя. Поэтому нет смысла приводить его к void *.

. И указатель wsk+i не может быть равен NULL в этом l oop, потому что изначально он указывает на объект.

Просто удалите оператор if и выведите каждый символ в l oop.

И это плохая идея использовать магические числа c, такие как 12, используемые в l oop.

Вы можете написать, например,

const size_t N = sizeof( tab ) / sizeof( *tab );

и затем в l oop

for ( size_t i = 0; i < N * sizeof( int ); i++ )
//...

Что касается предупреждения, то оно не относится к представленному коду при условии, что вы включили заголовок <stdio.h>.

0 голосов
/ 05 марта 2020

wsk никогда не будет нулевым, так как вы установили его равным tab (массивы в C / C ++ являются просто указателями на блок данных. Предупреждение говорит вам, что независимо от того, как сколько вы добавляете к wsk, оно всегда будет ненулевым. Вам нужно ограничить количество итераций в l oop количеством допустимых элементов в массиве, так как в массивах C / C ++ нет терминаторов. kind.

printf может просто сбить с толку CLang. Попробуйте printf("%d ", wsk[i]);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...