当前位置: 代码迷 >> Android >> 如何覆盖结构数组元素中的数据?
  详细解决方案

如何覆盖结构数组元素中的数据?

热度:96   发布时间:2023-08-04 10:33:51.0

所以,我有这个结构:

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手机上编码。

void overwrite(Products store){

C是按值传递的,您需要传递一个指向Products的指针(即Products *store ),并相应地修改editDataoverwrite调用。

基本上,问题是在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);

根据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*/

杰克解释了对代码不当行为的进一步解释。 我对你表示感谢。 该代码现在可以正常工作了。

  相关解决方案