【问题标题】:Objective-C: How to correctly initialize char[]?Objective-C:如何正确初始化 char[]?
【发布时间】:2023-03-21 21:54:01
【问题描述】:

我需要获取一个 char [] 数组并将其值复制到另一个数组,但每次都失败。

它使用这种格式工作:

char array[] = { 0x00, 0x00, 0x00 }

但是,当我尝试这样做时:

char array[] = char new_array[];

它失败了,即使 new_array 和原来的一样。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 请备份一个步骤并解释为什么要复制字符数组。
  • @Mike,原始的 char array[] 在循环中填充了其他值。循环结束后,我需要将其设置为下一个 char new_array[] 值。由于我(还)无法做到这一点,它会以错误的值开始下一个循环。

标签: objective-c arrays initialization char


【解决方案1】:

要在运行时复制,通常的 C 方法是使用 strncpymemcpy 函数。

如果您希望在编译时将两个 char 数组初始化为同一个常量初始化器,您可能会被 #define 卡住:

#define ARRAY_INIT { 0x00, 0x00, 0x00 }
char array[] = ARRAY_INIT;
char new_array[] = ARRAY_INIT;

问题是,这很少做,因为通常有更好的实现。

编辑:好的,所以你想在运行时复制数组。这是通过memcpy 完成的,它是<string.h> 的一部分(在所有地方)。

如果我没看错的话,你的初始条件是这样的:

char array[] = { 0x00, 0x00, 0x00 };
char new_array[] = { 0x01, 0x00, 0xFF };

然后你做一些事情,改变数组的内容,完成之后,你想设置array 来匹配new_array。就是这样:

memcpy(new_array, array, sizeof(array));
/*        ^         ^          ^
          |         |          +--- size in bytes
          |         +-------------- source array
          +-------------------------destination array
 */

库编写者选择首先将参数与目标进行排序,因为这与赋值中的顺序相同:destination = source

在 C、Objective-C 或 C++ 中,没有语言级别的内置方法可以使用这样的原始数组复制数组。 C++ 鼓励人们使用std::vector,而Objective-C 鼓励人们使用NSArray

不过,我仍然不确定您到底想要什么。

【讨论】:

  • char array[] 是 { 0x00, 0x00, 0x00 },但是 char new_array[] 是不同的,例如 { 0x01, 0x00, 0xFF } - 所以我不能这样定义它。有没有办法“重置”它=定义的值,所以在循环一之后它会采用下一个默认值?
  • 非常感谢——这绝对是有用的信息;我一直在四处走动,试图弄清楚为什么事情不完全有意义。 sizeof(array) 应该如何表示?我认为这会起作用,尽管现在出现“无法识别的选择器”错误。看起来它在__len size_t __memcpy_chk 上崩溃了,我认为它可能正试图从 void * 变为 const void * [谢谢!]
  • 如果没有一些代码剪切和粘贴,目前几乎不可能为您提供帮助。
  • 毫无疑问你帮助了我。该代码非常长,因此尝试将其发布在这里可能行不通。如果你想让我把项目上传到我可以上传的地方,请告诉我。
  • 标准程序是自己制作项目的副本,然后从中剪切部分,直到您拥有能够重现该行为的最小程序,然后发布。因此,例如,在这种情况下,如果你有一个 for 循环,里面有很多东西,但重要的是它修改了array,你可以用几行来替换它的大部分,改变部分或全部array.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2022-01-01
  • 2010-11-11
相关资源
最近更新 更多