我有指针的两d阵列结构。我试图结构复制到其他数组元素指向的斑点。对我而言,明确的方法是使用解引用运算符分配每个值。我不想做array[0][1] = array[1][0];
,因为那样会分配该结构的地址。所以我在想,如果我能做到
*array[0][1] = *array[1][0];
作为复制结构的更快方法?
答案 0 :(得分:1)
要复制 struct ,只需进行简单的分配即可。 memcpy()
不是必需的-函数调用也不是首选。
struct {
int piece;
int color;
} chessman;
chessman p1, p2;
...
p1 = p2;
通过指向struct
的指针数组,也可以。
chessman *array[8][8] = { 0 };
array[1][0] = malloc(sizeof *(array[1][0]));
assign_data(array[1][0]);
array[0][1] = malloc(sizeof *(array[0][1]));
assign_data(array[0][1]);
...
chessman empty = { 0 };
*array[0][1] = *array[1][0];
*array[1][0] = empty;
回想一下,这样的副本是浅副本。以下分配将指针复制到成员other_data
中,而不是other_data
引用的内容中。
struct {
int piece;
int color;
foo *other_data;
} chessman2;
chessman q1, q2;
q1 = q1;
答案 1 :(得分:0)
您可以执行*(array[0][1]) = *(array[1][0]);
复制一个结构对象,但是您必须确保array[0][1]
已经指向正确分配的一些内存。因此,如果array[0][1]
到目前为止尚未初始化,则可以写
array[0][1] = malloc(sizeof(*array[0][1]));
*(array[0][1]) = *(array[1][0]);
答案 2 :(得分:0)
假设数组元素(指针)引用正确分配的位置,则没有更有效的方法来分配结构。
编译器知道结构的大小,并将为其发出最有效的代码。 <mat-card class="fields-list" *ngIf="tableShown">
<mat-card-content>
<mat-card-actions align="end">
<button type="button" class="topia-btn topia-primary-btn action-buttons" (click)="addClicked()">
Add New Office
</button>
</mat-card-actions>
<mat-table #table [dataSource]="officePinList">
<ng-container cdkColumnDef="label">
<mat-header-cell *cdkHeaderCellDef fxFlex="20%">Label</mat-header-cell>
<mat-cell *cdkCellDef="let officePin" fxFlex="20%">{{officePin.label}}</mat-cell>
</ng-container>
<ng-container cdkColumnDef="postalAddress">
<mat-header-cell *cdkHeaderCellDef fxFlex="55%">Postal Adress</mat-header-cell>
<mat-cell *cdkCellDef="let officePin" fxFlex="55%">{{officePin.postalAddress}}</mat-cell>
</ng-container>
<ng-container cdkColumnDef="trash-icon">
<mat-header-cell *cdkHeaderCellDef fxFlex="15%"></mat-header-cell>
<mat-cell *cdkCellDef="let officePin" fxFlex="15%">
<mat-icon (click)="deleteGroupOffices(officePin.id)" mat-list-icon matTooltip="Delete" class="icon">
delete_forever
</mat-icon>
<mat-icon (click)="editField(officePin.id)" mat-list-icon matTooltip="Edit" class="icon">edit</mat-icon>
</mat-cell>
</ng-container>
<mat-header-row *cdkHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row class="table-row" *cdkRowDef="let officePin; columns: displayedColumns;"></mat-row>
</mat-table>
的方式会变慢。
memcpy
及其结果代码:
typedef struct
{
int a;
double b;
char c;
}a;
typedef struct
{
int a[5];
double b[10];
char c[100];
}b;
typedef struct
{
int a[50];
double b[100];
char c[100];
}l;
volatile a c[5];
volatile a *d[5] = {&c[0], &c[1], &c[2], &c[3], &c[4]};
volatile b e[5];
volatile b *f[5] = {&e[0], &e[1], &e[2], &e[3], &e[4]};
volatile l m[5];
volatile l *n[5] = {&m[0], &m[1], &m[2], &m[3], &m[4]};
void foo(void)
{
*d[2] = *d[4];
}
void foo1(void)
{
*f[2] = *f[4];
}
void foo2(void)
{
*n[2] = *n[4];
}