我有一个填充了一些数据的结构,想通过为其分配一个指针来复制它。
我具有以下结构:
typedef struct items {
double cijena;
char sifra[100], naziv[100];
} ITEM, *ITEMcopy;
*ITEMcopy
应该是指向ITEM(副本)内容的指针。
在int main()
中:
ITEM items[n];
ITEM *ITEMcopy = &items; // this is wrong
*ITEMcopy
应该用于以后我要编辑以下内容的函数中:
void sort(ITEM **items, int n)
因此,基本上,我不想直接编辑ITEM items[n]
内容,而是要为其存储的数据分配一个指针,然后对其进行编辑。
产生错误的部分代码是ITEM *ITEMcopy = &items;
warning: initialization from incompatible pointer type
我希望我有点清楚。
答案 0 :(得分:1)
写时:
ITEM items[n];
您正在创建一个长度为ITEM
的{{1}}个数组,用于数据的所有内存都分配在堆栈上。现在,当您使用变量n
时,它指向数组items
中的第一个元素,它类似于指针,但是有一些有关其长度的额外信息。
写时:
items[0]
您正在创建一个名为ITEM *ITEMcopy;
的指针,该指针可以包含ITEMcopy
的位置,但是没有为任何ITEM
分配内存,ITEM
仅用于指向到已经存在的ITEMcopy
如果您分配它:
ITEM
ITEM *ITEMcopy = items;
指向ITEMcopy
中第一个ITEM
的位置。因此items
现在是指向ITEMcopy
中第一个元素的指针。
写时:
items
这是警告您,因为ITEM *ITEMcopy = &items;
已经像指针一样起作用。因此items
是指向&items
的指针,该指针与ITEM
不兼容,而ITEMcopy
期望指向ITEM
sort
函数应如下所示:
void sort(ITEM *items, int n)
要使用排序功能:
ITEM items[n];
sort(items, n);
在函数中使用变量:
void sort(ITEM *items, int n)
{
// could swap items[0] and items[1] like this
ITEM itemBuf;
memcpy(&itemBuf, &items[0], sizeof(ITEM));
memcpy(&items[0], &items[1], sizeof(ITEM));
memcpy(&items[1], &itemBuf, sizeof(ITEM));
}