如何将结构的先前读取元素分配给空(新)数组?
在以下示例中,在struct2
的每个输入元素之后,应将其存储到新数组arr
。
此示例提供 SIGSEGV 分段错误。
有人可以指出如何解决这个问题吗?
修改
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int id;
char name[30];
float price;
}PRODUCT;
typedef struct
{
int prodNumRep;
PRODUCT *productsRep;
float *quantityRep;
}REPOSITORY;
void inputProd(PRODUCT *prod)
{
printf("ID: ");
scanf("%d",&prod->id);
printf("Name: ");
scanf("%s",prod->name);
printf("Price: ");
scanf("%f",&prod->price);
}
void inputRep(REPOSITORY *rep)
{
printf("REPOSITORY: \n");
printf("Number of products: ");
scanf("%d",&rep->prodNumRep);
rep->productsRep=calloc(rep->prodNumRep,sizeof(*rep->productsRep));
rep->quantityRep=malloc(rep->prodNumRep*sizeof(float));
//new array
REPOSITORY *arr;
arr=(REPOSITORY*)malloc(rep->prodNumRep * sizeof(REPOSITORY));
int i;
for(i=0;i<rep->prodNumRep;i++)
{
printf("%d. product: \n",i+1);
inputProd(rep->productsRep+i);
printf("Quantity: ");
scanf("%f",&rep->quantityRep[i]);
//assign struct2 (previously read with inputStruct1) to array - SIGSEGV segmentation fault
arr->productsRep[i]=rep->productsRep[i];
arr->quantityRep[i]=rep->quantityRep[i];
}
}
int main()
{
REPOSITORY *rep;
rep=(REPOSITORY *)malloc(sizeof(REPOSITORY));
inputRep(rep);
return 0;
}
答案 0 :(得分:3)
您的问题是arr->productsRep[i]
实际上是在尝试取消引用productsRep上的指针,但是您没有为productsRep分配任何内存。我看到你正在尝试做什么,但我认为你需要重新构建你的逻辑和执行流程。
答案 1 :(得分:1)
无需在函数中声明新数组。从函数中删除以下语句
//new array
REPOSITORY *arr;
arr=(REPOSITORY*)malloc(rep->prodNumRep * sizeof(REPOSITORY));
和
//assign struct2 (previously read with inputStruct1) to array - SIGSEGV segmentation fault
arr->productsRep[i]=rep->productsRep[i];
arr->quantityRep[i]=rep->quantityRep[i];