gpt4 book ai didi

c - 在指向结构的指针上打印错误值

转载 作者:太空宇宙 更新时间:2023-11-04 02:53:27 24 4
gpt4 key购买 nike

我的代码有问题:

这是我在 3 个 union 中设置 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 个结构执行它时出现的问题:

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)));

但是不起作用。

我会很感激任何答案。感谢您的宝贵时间。

最佳答案

您需要将初始化 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 属性 - 您可以就地修改 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 的结果,所以我删除了不必要的强制转换。

关于c - 在指向结构的指针上打印错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19814048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com