如何将一维数组赋值给二维数组?

3

我有一个一维数组A[3]和一个二维数组B[4][3]。我想把数组A[3]分配给数组B[4][3]的其中一行。如何正确地做到这一点?

#include<stdio.h>

void main()
{
   int A[3]={1,2,3};
   int B[4][3]={0};
   int row_select=2;

   B[row_select][] = A;
}   

但是这个赋值语句不起作用。我不想使用for循环逐个分配元素。我希望只用一条语句就可以完成赋值。

1
memcpy 是一个不错的选择。 - iBug
1
你不能直接赋值数组。由于你不想一个一个元素地赋值,你必须使用memmove()memcpy()进行“逐字节”的赋值。这些函数可能不会进行字节复制,但是它们的规范就是这样。如果数组是结构体的一部分,你可以间接地赋值;然而,在这种情况下,这并没有帮助到你。 - Jonathan Leffler
@JonathanLeffler。您可以定义一个包含正确大小的数组且仅此而已的临时结构,进行一些指针转换,可能会得逞。 - Mad Physicist
@JonathanLeffler 除非我没有理解你最初的意思,否则这不起作用:https://ideone.com/pH1hS2,https://ideone.com/IQ6ttg。 - Mad Physicist
1
@MadPhysicist — 你可以在你的示例中使用 *b = *a; 来分配结构,而不会出现分配错误,但我认为你遇到了严格别名问题。这确实是一种狡猾的方法,不适合向提问者展示。 - Jonathan Leffler
显示剩余4条评论
2个回答

4

memcpy 可能是一个不错的选择,虽然它很可能在内部使用了循环。

memcpy(B[row_select], A, sizeof(A));

1

不要这样做:使用memcpy

有一种方法可以用单个语句完成赋值操作,只要你愿意进行一些预备工作,让你的代码变得难以理解。你可以利用结构体可以(1) 在一步中互相赋值,和(2) 包含固定大小的数组这一事实。编译器可能会在幕后运行memcpy,但这是一个荒谬练习:

#include<stdio.h>

#define SZ 3 // this is just for convenience

// a pointer to an anonymous structure containing our array
typedef struct {
    int x[SZ];
} *pthrowaway;

int main(void)
{
    int A[SZ]={1,2,3};
    int B[4][SZ]={0};
    int row_select=2;

    pthrowaway a = (pthrowaway)&A;
    pthrowaway b = (pthrowaway)&B[row_select];

    *b = *a; // magic

    return 0;
}

变量 ab 是不必要的。你实际上可以在一个语句中为数组赋值:
*(pthrowaway)&B[row_select] = *(pthrowaway)&A;

这里有一个 IDEOne 链接,展示了 C99 版本:https://ideone.com/IQ6ttg 还有一个普通的 C 版本:https://ideone.com/pH1hS2


据我所知,您(IDEOne网站)使用的是GCC 6.x,并且GCC 6.x将C11(有效的C18)视为默认版本(该更改发生在GCC 5.x; 在此之前,默认版本为C90 - 因此可怜的C99从未成为GCC标准的默认版本)。快速检查GCC发布的版本确认了我的记忆并没有太大问题- https://gcc.gnu.org/gcc-5/changes.html 将C11更改为顶部项目,GCC 5.1于2015年4月发布。 - Jonathan Leffler
据我所知,这种语法在很长时间以前就已经存在了,可能早在89年之前就有了。由于我使用的是移动平台,并且比较懒惰,因此IDEOne是我检查代码是否有效的首选工具。@JonathanLeffler - Mad Physicist
@Nate。可能不是。但为什么? - Mad Physicist
1
好的,看了一下 https://dev59.com/43VD5IYBdhLWcg3wE3Ro 和 https://en.cppreference.com/w/c/language/type,我认为 int[3]pthrowaway 不是兼容的类型。事实上,似乎数组和结构体永远不可能是兼容的类型。 - Nate Eldredge
1
小心C11中的示例3 §6.5.2.3 结构体和联合体成员。我也不确定如何解释它 - 要谨慎。 - Jonathan Leffler
显示剩余7条评论

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