c - strncpy 从 **char 到 *char[] 不复制最后一个元素

标签 c arrays strncpy

我正在尝试将 argv 的各个元素复制到第二个数组中。我正在使用 strncpy 来做到这一点。

这是一个复制该问题的精简版本。

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    printf("%d\n", argc);
    char *argvarray[argc];
    int arrlen;

    //int j;
    for(int j=0; j< argc; j++){
        arrlen = arrlen + strlen(argv[j]);
    }

    printf("size of argv: %d\n", arrlen); //see if size is right
    strncpy(*argvarray, *argv, arrlen);

    for(int j=0; j< argc; j++){
        printf("value of j: %d\n", j); //to see what's going on
        printf("%s\n", argv[j]); 
        printf("%s\n", argvarray[j]); //gets 1st element no problem
    }

    return 0;
}

如果我将 1 个 arg 传递给 main,它会将 argv 的第一个元素复制到 argvarray ,但不会复制第二个元素。如果我传递超过 1 个参数,它会在 strncpy() 上出现段错误。

为什么会发生这种情况?在事先不知道大小的情况下,将 char 数组(特别是在函数定义中声明的 char 数组)的所有元素复制到其他 char 数组(如 argv 的情况)的最佳方法是什么?

最佳答案

arrlen = arrlen + strlen(argv[j]);

arrlen 在未初始化的情况下使用(未定义的行为)。

正如 @PeterA.Schneider 所指出的,您需要为 argvarray 的每个元素提供空间,在 strncpy 之前使用 malloc >strdup

关于c - strncpy 从 **char 到 *char[] 不复制最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35506684/

相关文章:

c - <String.h> 是我的 strncpy 的实现吗?

c - 错误: 'i' does not name a type while compiling with mingw

java - 如何从 Android、Qualcomm 设备获取 RF/NV 项目?

java - 搜索算法 - Java

c++ - strncpy_s 不遵守标准?

C:使用 sprintf 和 strncpy 将数据插入指针数组

c++ - 在对函数指针进行 typedef 时 * 是强制性的吗?

C enum 打印错误?

java - 在数组中添加并求平均值

c# - 如何使用 PLinq 将二维文本文件读入二维数组