1

我的代码有问题:

这是我在 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 中的任何 valor。但是当我尝试制作多个结构时仍然崩溃。

在这里,我向您展示了当我执行超过 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有效。

我会欣赏任何答案。感谢您的时间。

4

2 回答 2

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 中你不需要 castmalloc的结果,所以我删除了不必要的演员表。

于 2013-11-06T14:04:04.540 回答
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++){
于 2013-11-06T14:05:54.940 回答