在C.中使用strdup这里出了什么问题

时间:2016-08-07 14:09:42

标签: c

我正在尝试编译以下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循环得到了错误的结果呢?请帮忙。谢谢。

2 个答案:

答案 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

调用所分配的内存