这是参考发布在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
答案 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)
您的循环变量it
的类型为char*
,数组的内容属于const char*
类型。如果您将it
更改为const char*
,警告就会消失。
您在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
,并在函数的开头而不是在循环语句中执行。