我正在尝试编译以下C代码:
#include<stdio.h>
#include<stdlib.h>
char *argv[] = {"v1.0", "v2.0", "v3.0"};
int main(void)
{
char *VER_LIST[] = {0};
int i;
/*for(i = 0; i<3; i++)
{
VER_LIST[i] = strdup(argv[i]);
}
VER_LIST[i] = NULL;*/
VER_LIST[0] = strdup(argv[0]);
VER_LIST[1] = strdup(argv[1]);
VER_LIST[2] = strdup(argv[2]);
VER_LIST[3] = NULL;
printf("%s", VER_LIST[2]);
return 0;
}
它显示正确的输出为v3.0,但如果我评论这部分代码
VER_LIST[0] = strdup(argv[0]);
VER_LIST[1] = strdup(argv[1]);
VER_LIST[2] = strdup(argv[2]);
VER_LIST[3] = NULL;
并使用for
循环而不是它向我显示错误的结果。为什么我使用for循环得到了错误的结果呢?请帮忙。谢谢。
答案 0 :(得分:3)
数组char *VER_LIST[] = {0};
只有一个元素,您不能向VER_LIST[1]
及更高版本写任何内容,否则您将调用未定义的行为。
首先分配足够的空间,例如char *VER_LIST[4] = {0};
。
答案 1 :(得分:2)
如果未在其声明中明确指定数组中的数字,则根据用于初始化数组的初始值设定项的数量来计算它。因此这个宣言
char *VER_LIST[] = {0};
将数组VER_LIST
声明为包含一个元素。
您应该至少将数组定义为具有与数组argv一样多的元素加上一个用于最后一个将设置为NULL的元素。
例如
char *VER_LIST[sizeof( argv ) / sizeof( *argv ) + 1] = {0};
此外,您还需要释放每次strdup