Целье Статически выделяемого массива за пределами режима C99?

StackOverflow https://stackoverflow.com/questions/1969706

  •  21-09-2019
  •  | 
  •  

Вопрос

Это относится к решению, опубликованному на: Зацикливание массива фиксированного размера без определения его размера в C

Вот мой пример кода:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    static const char *foo[] = {
           "this is a test",
           "hello world",
           "goodbye world",
           "123", 
           NULL
    };

    for (char *it = foo[0]; it != NULL; it++) {
        printf ("str %s\n", it);
    }

    return 0;

}

Попытка скомпилировать это дает:

gcc -o vararray vararray.c
vararray.c: In function ‘main’:
vararray.c:14: warning: initialization discards qualifiers from pointer target type
vararray.c:14: error: ‘for’ loop initial declaration used outside C99 mode
Это было полезно?

Решение

Помимо инициализации в петле, вы увеличиваете не в том месте. Я думаю, что это то, что вы имеете в виду (обратите внимание, что я не совсем являюсь C Guru):

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    static const char *foo[] = {
           "this is a test",
           "hello world",
           "goodbye world",
           "123", 
           NULL
    };
    const char **it;
    for (it=foo; *it != NULL; it++) {
        printf ("str %s\n", *it);
    }

    return 0;

}

Другие советы

  1. Ваша переменная цикла it имеет тип char*, содержимое массива имеет тип const char*. Анкет Если вы изменитесь it быть также const char* Предупреждение должно исчезнуть.

  2. Вы заявляете it Внутри утверждения это не допускается в C до C99. Объявить it в начале main() вместо.
    В качестве альтернативы вы можете добавить -std=c99 или же -std=gnu99 на ваши флаги GCC, чтобы включить языковые функции C99.

Использовать -std=c99 опция при составлении кода, чтобы использовать C99 Особенности.

Изменять it к const char* Тип (чтобы удалить предупреждения)

Перед C99 объявление этого указателя персонажа в цикле FO не является стандартным.

Вам нужны две вещи, чтобы иметь эту компиляцию без предупреждений: объявить итератор const char* it, и сделайте это в начале функции, а не в операторе цикла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top