问题描述
所以,我有这个结构:
typedef struct{
int serialNumber;
char name[100];
float price;
int quantity;
}Products;
我动态创建了一个结构数组。
任务是“模拟”杂货店,使用户能够添加和编辑商店出售的商品。 以下代码段用于编辑结构数据。
void overwrite(Products store){
printf("Enter new serial number: ");
scanf("%d", &(store.serialNumber));
getchar();
printf("Enter new product name: ");
fgets(store.name, 100, stdin);
store.name[strlen(store.name)-1]='\0';
printf("Enter new product price: ");
scanf("%f", &(store.price));
printf("Enter new product quantity: ");
scanf("%d", &(store.quantity));
}
void editData(Products *store, int storeCapacity){ //storeCapacity needed to invoke printData(), assume a working code for the function.
int choice;
printData(store, storeCapacity);
printf("Enter slot number of product here: ");
scanf("%d", &choice);
overwrite(store[choice]);
}
这是要抓住的地方,即使这段代码有效,当我尝试打印数据时,数据也会显示应被覆盖的值。 我忘了做某事吗? 我希望你能帮助我。
顺便说一句,我在Android手机上编码。
1楼
void overwrite(Products store){
C是按值传递的,您需要传递一个指向Products
的指针(即Products *store
),并相应地修改editData
的overwrite
调用。
2楼
基本上,问题是在C中您通过值传递参数。 因此,当您指定此签名时
void overwrite(Products store)
然后在某处调用它:
Products myStore;
overwrite(myStore);
发生的myStore
是创建了myStore
的副本并将其放置在堆栈上,然后将该值传递给该函数。
这意味着对overwrite
内部的Products
对象所做的所有修改都适用于传递的副本,而不适用于原始对象。
退出overwrite
功能范围时,此副本将被丢弃。
要解决此问题,您必须传递一个指向该对象的指针,该指针通过值传递,但作为地址将指向完全相同的myStore
对象。
这是通过以下方式完成的:
void overwrite(Products* store)
{
..
scanf("%f", &store->price);
..
}
Products myStore;
overwrite(&myStore);
3楼
根据Ouah的说法,我将结构作为值本身传递了,这确实发生在我的代码中。
所以我做了...
void overwrite(Products * store){ //formal parameter changed into a pointer
//codes here
}
和...
overwrite(&(store[choice])); /* actual parameter changed into a pointer by affixing ampersand*/
杰克解释了对代码不当行为的进一步解释。 我对你表示感谢。 该代码现在可以正常工作了。