在C中分配结构整数(int)时的随机数

问题描述 投票:0回答:1

我正在动态分配程序所需的ram数量。在我遇到此问题之前,它工作正常。这是当我键入要在结构内的一个项目(称为整数)中的内容时,如果我键入例如10以上的数字(12345678912),它将发回给我,这是完全不同的数。这是我的代码:

#include <stdio.h>
#include <stdlib.h>

struct cadastro
{
char email[50];
char nome[20];
int idade;
int telefone;
};

int main()
{
int quantidade_cadastros;
int decisao = 1;

printf("\nQuantos cadastros deseja realizar?\n");
printf("Quantidade: ");
scanf("%d", &quantidade_cadastros);
getchar();

//Definindo a quantidade de cadastros que podem ser realizados no struct e o nome que sera usado para chamar o struct
struct cadastro *cad;
cad = NULL;

cad = malloc(quantidade_cadastros * sizeof(struct cadastro));

for (int i = 0; i < quantidade_cadastros; i++)
{
    printf("\nDigite o NOME da pessoa que sera inserida no indice %d: ", i);
    fgets(cad[i].nome, 20, stdin);
    printf("Digite o EMAIL da pessoa que sera inserida no indice %d: ", i);
    fgets(cad[i].email, 50, stdin);
    printf("Digite a IDADE da pessoa que sera inserida no indice %d: ", i);
    scanf("%d", &cad[i].idade);
    getchar();
    printf("Digite o TELEFONE da pessoa que sera inserida no indice %d: ", i);
    scanf("%d", &cad[i].telefone);
    getchar();
}

for (int i = 0; i < quantidade_cadastros; i++)
{
    printf("\nNOME: %s", cad[i].nome);
    printf("EMAIL: %s", cad[i].email);
    printf("IDADE: %d", cad[i].idade);
    printf("\nTELEFONE: %d", cad[i].telefone);
    printf("\n");
}

printf("\n");
free(cad);
}

这是我输入的内容:

Quantos cadastros deseja realizar?
Quantidade: 2

Digite o NOME da pessoa que sera inserida no indice 0: Test1
Digite o EMAIL da pessoa que sera inserida no indice 0: Email1
Digite a IDADE da pessoa que sera inserida no indice 0: 19
Digite o TELEFONE da pessoa que sera inserida no indice 0: 1234567891

Digite o NOME da pessoa que sera inserida no indice 1: Test2
Digite o EMAIL da pessoa que sera inserida no indice 1: Email2
Digite a IDADE da pessoa que sera inserida no indice 1: 18
Digite o TELEFONE da pessoa que sera inserida no indice 1: 12345678912

NOME: Test1
EMAIL: Email1
IDADE: 19
TELEFONE: 1234567891

NOME: Test2
EMAIL: Email2
IDADE: 18
TELEFONE: -539222976
c struct dynamic-memory-allocation
1个回答
3
投票

您正在遇到int溢出。您输入的第二个“电话号码”大于一个int可以存储的大小,并且您没有验证读数。 scanf可能失败了,并且没有将任何内容存储在int中-这意味着它的存储区域中仍然存在随机位,因为您从未清除过它。然后,printf打印这些随机信息。

您应该总是验证scanf是否成功-它会返回成功分配的字段数,此处为1。因此,您应该使用`if(scanf(...)!= 1){/ 处理错误 /},而不要忽略它。

© www.soinside.com 2019 - 2024. All rights reserved.