【问题标题】:Copying array in array of pointer to char在指向char的指针数组中复制数组
【发布时间】:2021-07-29 14:45:59
【问题描述】:

我有一个 char 数组,我正在尝试使用 strncpy 函数将它的一部分(标记化)复制到指向 char 的指针数组的第 0 个索引中。但是在运行时会发生分段错误。

代码示例:

char array[30] = "ls -l";
char* args[10];

strncpy(args[0], array + 0, 2);

【问题讨论】:

  • 您尝试只复制前 2 个字符,甚至不放置 NUL 终止符。这是故意的吗?

标签: arrays c linux segmentation-fault char


【解决方案1】:

char *args[10] 有以下声明:

将 args 声明为指向 char 的指针的数组 10

也就是说,我们有一个未初始化的指针数组。我们需要先让这些指针指向某个地方,然后再尝试将字符放在那里。记住我们必须 NUL 终止 ('\0') C 字符串,我们可以同时使用 calloc 为我们的字符串分配 NUL 空间。

这将为'l''s' 和我们的强制性'\0' 腾出空间。

char original_command[30] = "ls -l";
char *args[10] = { 0 };
args[0] = calloc(3, sizeof (char));
strncpy(args[0], original_command, 2);

或者,我们可以使用malloc,但我们必须记住 NUL 终止字节。

args[0] = malloc(3);
strncpy(args[0], original_command, 2);
args[0][2] = '\0';

始终初始化我们的变量通常是一个好主意 - 看看我们如何初始化我们的 args 数组以充满 NULL 指针 (0)。很清楚他们还没有指出任何有用的地方。

还要注意,如果在源字符串的第一个 n 字节中找不到 NUL 终止字节,strncpy 不会放置它。这就是手动终止目标字符串非常重要的原因。

此外,当我们用完该内存时,任何对 *alloc 函数的调用都必须在稍后与对 free 的调用相匹配。

/* Do whatever needs to be done */
/* ... */
free(args[0]);

【讨论】:

  • sizeof(char) 定义为 1
  • @0___________ 当然是。然而,这恰恰展示了 calloc 的第二个参数是什么。
【解决方案2】:

需要为复制的字符串内容分配空间; char* args[10] 只为保存指向内容的指针保留空间,而不是为内容本身保留空间。并且不要忘记为字符串终止字符'\0'预留空间。

args[0] = malloc(2+1);
strncpy(agrs[0],array+0,2+1);
agrs[0][2] = '\0';

【讨论】:

  • args[0]中的字符串以空值终止也是一个好主意。
  • strncpy(agrs[0],array+0,2+1) 看起来很可疑。
  • 这有 UB,因为strncpy 将复制第一个 3 字节(即 'l''s''s'' '),而不是 NUL 正确终止。
  • 看来,人们在写 args 时遇到了问题。第二次在这个线程。 ;-)
猜你喜欢
  • 2021-01-26
  • 2012-03-19
  • 1970-01-01
  • 2018-04-05
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多