我的代码出现问题:
这时我在3个联合中设置了valor1,valor2,valor3的值,然后在结构“estrucuras”中保存。
union atributo{
int valor1;
char *valor2;
float valor3;
};
struct estructura{
int *tipo;
union atributo *list;
};
union atributo *atributos;
struct estructura *estructuras;
estructuras = malloc (sizeof(struct estructura) * (cantEstruct) );
int cantEstruct=2;
int tamEstruct=3;
srand(rdtsc());
for(i=0;i<cantEstruct;i++){
estructuras[i].list=malloc(sizeof(union atributo) * tamEstruct);
for (j=0;j<tamEstruct;j++){
switch ((tiposAtributos[j])) {
case 1:
estructuras[i].tipo[j]=1;
estructuras[i].list[j].valor1= rand()%10000000;
printf("Saving %d\n", estructuras[i].list[j].valor1);
break;
case 2:
estructuras[i].tipo[j]=2;
tamChar = 10;
estructuras[i].list[j].valor2 = malloc(sizeof(char) * (tamChar+1));
for(k=0;k<tamChar;k++){
estructuras[i].list[j].valor2[k]= 'A' + ( rand() % ( 'Z' - 'A'));
}
estructuras[i].list[j].valor2[k] = '\0';
printf("Saving %s\n",estructuras[i].list[j].valor2);
break;
case 3:
estructuras[i].tipo[j]=3;
float valor1=(((float)rand())+1.0)*500000.0;
float valor2=(((float)rand())+1.0)*25.0;
estructuras[i].list[j].valor3=valor2/valor1;
printf("Saving %.25f\n", estructuras[i].list[j].valor3);
break;
}
}
}
以下是我获取并打印值以及问题所在的位置:
for(i=0;i<cantEstruct;i++){
printf("Valores de la estructura %d\n", i);
for (j=0;j<tamEstruct;j++){
switch (tiposAtributos[j]) {
case 1:
//atributos=malloc(sizeof(union atributo));
//*atributos = estructuras[i].list[j];
//printf("Valor del atributo %d\n",atributos->valor1);
printf("Value %d\n", estructuras[i].list[j].valor1);
break;
case 2:
//atributos=malloc(sizeof(union atributo));
//*atributos = estructuras[i].list[j];
//printf("Valor del atributo%s\n",atributos->valor2);
printf("Value %s\n",estructuras[i].list[j].valor2);
break;
case 3:
//atributos=malloc(sizeof(union atributo));
//*atributos = estructuras[i].list[j];
//printf("Valor del atributo %.25f\n",atributos->valor3);
printf("Value %.25f\n", estructuras[i].list[j].valor3);
break;
}
}
}
现在适用于tamEstruct中的任何英雄。但是当我尝试制作多个结构时仍然会崩溃。
这里我向你展示了当我执行超过1次estruct时的问题:
Saving 4089113
Saving UBJPXTWDJA
Saving 0.0001530080626253038644791
*** Process received signal ***
Signal: Segmentation fault (11)
Signal code: Address not mapped (1)
Failing at address: (nil)
现在保存第一个结构但第二个结构崩溃。我试过这个:
estructuras[i].list=malloc((sizeof(char)*(tamChar+1) * (tamEstruct)));
但dosnt有效。
我会回答任何答案。 谢谢你的时间。
答案 0 :(得分:1)
您需要将初始化estructuras[i].list
的行移动到第二个循环之外,如下所示:
for(i=0;i<cantEstruct;i++){
estructuras[i].list=malloc(sizeof(union atributo) * tamEstruct);
estructuras[i].tipo=malloc(sizeof(int) * tamEstruct);
for (j=0;j<tamEstruct;j++){
...
}
}
您当前的代码不断重新初始化每个属性的整个列表,因此只有最后一个属性以正确的值结束,并且所有先前的值都会泄露。这就是您的打印功能打印错误值的原因 - 这是列表中未初始化的值。
编辑:(响应问题的编辑)
switch
声明中的作业也不正确。您无需malloc
新的uinon attribute
- 您可以修改union
,如下所示:
srand(rdtsc()); // Move this line to outside the loops
...
switch ((tiposAtributos[j])) {
case 1:
estructuras[i].tipo[j]=1;
estructuras[i].list[j].valor1= rand()%10000000;
printf("Saving %d\n", estructuras[i].list[j].valor1);
break;
case 2:
estructuras[i].tipo[j]=2;
tamChar = 10;
estructuras[i].list[j].valor2 = malloc(tamChar+1);
for(k=0;k<tamChar;k++){
estructuras[i].list[j].valor2.valor2[k]= 'A' + ( rand() % ( 'Z' - 'A'));
}
estructuras[i].list[j].valor2.valor2[k] = '\0';
printf("Saving %s\n",estructuras[i].list[j].valor2);
break;
case 3:
estructuras[i].tipo[j]=3;
float valor1=(((float)rand())+1.0)*500000.0;
float valor2=(((float)rand())+1.0)*25.0;
estructuras[i].list[j].valor3=valor2/valor1;
printf("Saving %.25f\n", estructuras[i].list[j].valor3);
break;
}
注意:在C中你不需要投射malloc
的结果,所以我删除了不必要的演员。
答案 1 :(得分:1)
您的问题是您一直在覆盖您的列表:
for(i=0;i<cantEstruct;i++){
for (j=0;j<tamEstruct;j++){
estructuras[i].list=(union atributo *)malloc(sizeof(union atributo) * tamEstruct);
应该是:
for(i=0;i<cantEstruct;i++){
estructuras[i].list=(union atributo *)malloc(sizeof(union atributo) * tamEstruct);
for (j=0;j<tamEstruct;j++){