【问题标题】:How to properly copy char array to char array?如何正确地将 char 数组复制到 char 数组?
【发布时间】:2013-09-05 16:11:36
【问题描述】:

我是 C 的新手,我正在尝试让 C 例程正常工作。

const char *filenames[entry_count];
for (i = 0; i < entry_count; i++) {
    char filename_inzip[256];
    unz_file_info file_info;
    err = unzGetCurrentFileInfo(uf, &file_info, filename_inzip,
            sizeof(filename_inzip), NULL, 0, NULL, 0); 

    //This doesn't work. My array gets filled with the last entry over and over.
    filenames[i] = filename_inzip; //Option 1

    //Here I get SIGSEV errors, or gibberish in output when debugging values
    strcpy(filenames[i], filename_inzip); //Option 2
}

我猜第一个赋值不起作用,因为它只是指向循环中 char[256] 的相同临时内存地址。

我认为第二个选项不起作用,因为我没有使用malloc 或类似的。

如何获得正确填充的数组?

【问题讨论】:

  • filenames[i] 不是 char 数组。这是一个指针。

标签: c arrays copy


【解决方案1】:

您是正确的,您需要在第二个选项中分配内存。

filenames[i] = strdup(filename_inzip);

是最简单的方法。

strdup 是 Posix 函数而不是标准 C。如果它不适合您

filenames[i] = malloc(strlen(filename_inzip)+1);
if (filenames[i] != NULL) {
    strcpy(filenames[i], filename_inzip);
}

做同样的工作

请注意,您还必须为稍后在程序中分配的每个数组元素调用 free

【讨论】:

  • 好的,我需要使用一个循环然后在每个循环上免费调用吗?
  • 是的。注意不要在任何未赋值的元素上调用freefree(NULL) 的行为是明确定义的,因此在代码开头将所有元素设置为 NULL 将允许您稍后仅循环通过索引 [0..entry_count] 而不必担心实际分配了多少元素。跨度>
  • 我想没有办法通过一次调用而不是循环来free 完整的数组?
  • 没有。作为一般规则,对malloc 的每次调用都必须有一个稍后对free 的匹配调用。如果你在循环中调用malloc,那么你应该期望稍后在循环中调用free
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
相关资源
最近更新 更多