【问题标题】:Copying string array into another string array - C将字符串数组复制到另一个字符串数组 - C
【发布时间】:2012-09-18 02:23:01
【问题描述】:

我有一个包含字符串数组(char **args)的结构。我需要能够将字符串数组 (char *input[32]) 复制到结构的该元素中。例如:

Thing s;
s.args = input; //assuming input already has some strings in it

当我尝试这样做时,下一次调用 s.args = input 时,它会完全覆盖旧输入。如何以适当的方式实现此功能?

编辑

这就是结构的样子。

typedef struct{
char **args;
} Thing;

然后在我的函数中,我声明了:

char *args[512];
.....
args[count] = string //string is a char *

那么最后,我想做:

s.args = input.

【问题讨论】:

  • 你的意思是要用更多的字符串来扩展当前的字符串数组?

标签: c struct


【解决方案1】:

你没有复制它。您实际上只是在设置指针。实际上你有这个:

char **args;
char *other[32];
args = other;

您需要实际复制数组 - 为此您需要为其分配内存:

s.args = malloc( 32 * sizeof(char*) );

for( i = 0; i < 32; i++ ) s.args[i] = input[i];

这是一个浅拷贝——它会拷贝你的字符串指针,但不会复制它们。如果您更改input 中字符串的内容,该更改将反映在s.args 中。要复制字符串,您必须这样做:

for( i = 0; i < 32; i++ ) s.args[i] = strdup(input[i]);

既然你已经分配了内存,那么在你再次覆盖s.args 之前(以及当你的程序完成时)你需要释放你分配的内存。这包括字符串(如果您调用了strdup);

if( s.args != NULL ) {
    // Only do the loop if you did a deep copy.
    for( i = 0; i < 32; i++ ) free(s.args[i]);

    // Free the array itself
    free(s.args);
}

【讨论】:

  • 糟糕,我误读了问题中的一个重要事实。已编辑以更正我的答案。
  • 所以如果我使用 strdup,我要做的事情的顺序是这样的?:1)分配内存 2)释放分配的空间 3)用 s.args[i] = strdup 复制(输入[i]) ?
  • 是的。首先分配数组,然后将strdup 每个字符串分配到其中。完成后,free 首先是字符串,然后是数组。
  • 哦,您在我回复旧评论时编辑了您的评论。不,您只能释放已分配的指针(例如 malloc 或strdup)。分配数组后,其内容将是未定义的。在初始化它们之前,您不会去释放这些值。
  • 请不要投malloc的返回:stackoverflow.com/questions/605845/…
猜你喜欢
  • 2015-08-22
  • 1970-01-01
  • 2012-08-15
  • 2010-10-27
  • 2015-06-06
  • 1970-01-01
  • 2011-07-09
  • 2020-11-04
  • 2015-03-23
相关资源
最近更新 更多