如何在C语言中连接两个字节数组?

12

我正在Arduino平台上编写代码,尝试用C语言编写一个能够连接/追加字节数组的函数。

byte a[] = {a1, ..., an};
byte b[] = {b1, ..., bm};

byte c[] = a + b; // equivalent to {a1, ..., an, b1, ..., bm}
什么是获得上述结果的最佳方法?
我试过在网上搜索,但没有太大的运气。我看到了SO上的另一个答案,其中突出了需要执行此操作所需的步骤,但我无法跟随它们。他们还说有一些库可以处理这种情况,但由于我在Arduino上,我不确定这些是否完全可用于我。
我理解需要进行某种内存操作才能使其工作,但我对这些低级别的操作很陌生,所以它们对我来说并不太有意义。我有高级语言(C#,Java和一些C ++)的经验。
另外,我还应该补充:同样的技术是否也适用于:
byte a[] = {a1, ..., an};
byte b[] = {b1, ..., bm};

a = a + b

尺寸是固定的吗? - Iharob Al Asimi
假设byte是一个与char大小相等的等效类型,如果确实是这样声明了ab,那么byte c[sizeof(a) + sizeof(b)];和两个memcpy调用就可以完成它。 - WhozCraig
@WhozCraig 是的。a 和 b 是这样声明的。不过,我已经编辑了问题,包含了 b 也被追加到 a 中的情况。 - Ali Caglayan
@Alizter,除非a最初的大小足以容纳其数据和附加数据的空间,并且迟早还是需要进行类似于memcpy的操作。无论如何,您使用的语法绝对不符合C语言的规范。 - WhozCraig
@WhozCraig 是的,我知道这绝对不是C语言。我用伪代码风格编写它,以更好地解释我的问题。 - Ali Caglayan
@Alizter 更复杂的情况,例如在运行时获取大小,需要在第一种情况下使用malloc(),在第二种情况下使用realloc(),但所有情况都将使用memcpy()来复制数据。 - Iharob Al Asimi
2个回答

13

在C语言中,没有byte类型。除非它是某种类型定义,否则可以使用unsigned char或从<stdint.h>中选择适当的固定类型。以下是一些解决方案:

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

int main(void) {
    unsigned char a[3+3] = {1, 2, 3}; // n+m
    unsigned char b[3]   = {4, 5, 6}; // m

    memcpy(a+3, b, 3); // a+n is destination, b is source and third argument is m

    for (int i = 0; i < 6; i++) {
        printf("%d\n", a[i]);
    }

    return 0;
}

请确保数组a至少有空间容纳n + m个元素(此处n = 3m = 3),以避免数组溢出问题(即未定义行为,可能会导致程序崩溃甚至更糟)。


1
你如何确保a有足够的空间? - Ali Caglayan
1
@Alizter unsigned char a[3 + 3] 的空间可以容纳初始的 a 和显然附加的 b - Iharob Al Asimi
@iharob 哦!我以为我漏掉了某个尺寸。当然。 - Ali Caglayan
所以,如果我们要谈论一个数组c,假设ab都是满的,我们需要将c设置为a+b的“长度”,然后使用memcpy()ba复制到c中。但我不确定你使用的a+3语法是什么意思?它是什么意思? - Ali Caglayan
1
@Alizter:哦,我的认知只注册了a=a+b的情况。对于c=a+b,你需要将a复制到c,然后将b复制到c+nc+n的工作方式与a+3相同。a“衰变”(或更正式地转换)为数组中第一个元素的地址。通过与整数的+运算符,您正在执行指针算术运算。a+3等同于&a[3],所以我相信您现在有了一个想法。 - Grzegorz Szpetkowski

0
如果大小已知,您可以简单地创建一个具有该大小的新字节数组,并使用简单的循环来填充它。

不需要使用循环。 - Iharob Al Asimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接