我有一个一维数组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循环逐个分配元素。我希望只用一条语句就可以完成赋值。
memcpy
可能是一个不错的选择,虽然它很可能在内部使用了循环。
memcpy(B[row_select], A, sizeof(A));
不要这样做:使用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;
}
a
和 b
是不必要的。你实际上可以在一个语句中为数组赋值:*(pthrowaway)&B[row_select] = *(pthrowaway)&A;
这里有一个 IDEOne 链接,展示了 C99 版本:https://ideone.com/IQ6ttg 还有一个普通的 C 版本:https://ideone.com/pH1hS2
int[3]
和 pthrowaway
不是兼容的类型。事实上,似乎数组和结构体永远不可能是兼容的类型。 - Nate Eldredge
memcpy
是一个不错的选择。 - iBugmemmove()
或memcpy()
进行“逐字节”的赋值。这些函数可能不会进行字节复制,但是它们的规范就是这样。如果数组是结构体的一部分,你可以间接地赋值;然而,在这种情况下,这并没有帮助到你。 - Jonathan Leffler*b = *a;
来分配结构,而不会出现分配错误,但我认为你遇到了严格别名问题。这确实是一种狡猾的方法,不适合向提问者展示。 - Jonathan Leffler