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

  • 本文关键字:问题 这里 strdup
  • 更新时间 :
  • 英文 :


我正在尝试编译以下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;

而使用CCD_ 1循环,它向我显示了错误的结果。为什么我使用for循环得到了错误的结果?请帮忙。谢谢

数组char *VER_LIST[] = {0};只有一个元素,您不能向VER_LIST[1]及以上版本写入任何内容,否则您将调用未定义的行为

char *VER_LIST[4] = {0};一样,先分配足够的空间。

当数组中的数字没有在其声明中明确指定时,它将根据用于初始化数组的初始化器的数量进行计算。因此,本声明

char *VER_LIST[] = {0};

声明数组CCD_ 5具有一个元素。

您应该将数组定义为至少有数组argv的元素数加上最后一个将设置为NULL的元素的元素数。

例如

char *VER_LIST[sizeof( argv ) / sizeof( *argv ) + 1] = {0};

此外,您还需要释放strdup 每次调用分配的内存

相关内容

最新更新