在c99模式之外循环静态分配的数组?

时间:2009-12-28 14:29:22

标签: c c99 loops

这是参考发布在Looping a fixed size array without defining its size in 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

5 个答案:

答案 0 :(得分:7)

除了for循环中的初始化之外,你在错误的地方递增。我认为这就是你的意思(请注意,我不是一个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
    };
    const char **it;
    for (it=foo; *it != NULL; it++) {
        printf ("str %s\n", *it);
    }

    return 0;

}

答案 1 :(得分:6)

  1. 您的循环变量it的类型为char*,数组的内容属于const char*类型。如果您将it更改为const char*,警告就会消失。

  2. 您在for语句中声明it,在C99之前的C中不允许这样做。而是在it的开头声明main() 或者,您可以将-std=c99-std=gnu99添加到您的gcc标记以启用C99语言功能。

答案 2 :(得分:1)

在编译代码时使用-std=c99选项以使用C99功能。

it更改为const char*类型(以删除警告)

答案 3 :(得分:0)

在C99之前,声明for循环中的字符指针是非标准的。

答案 4 :(得分:0)

在没有警告的情况下进行编译需要两件事:声明迭代器const char* it,并在函数的开头而不是在循环语句中执行。