【问题标题】:Random number when allocation struct integer (int) in CC中分配结构整数(int)时的随机数
【发布时间】:2020-04-04 21:37:56
【问题描述】:

我正在动态分配我的程序所需的内存量。在我遇到这个问题之前它工作正常。这是当我输入将在我的一个项目内的内容时,如果我输入超过 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

【问题讨论】:

  • 一个 int 可以在你的系统上保存的最大数是多少?
  • @Eraklon 不,因为我不想生成数字,我想知道为什么它输出的数字与我输入的数字完全不同
  • 点击错误。但这仍然是重复的。阅读有关整数溢出的信息。
  • @Eraklon 我搜索了有关 int 的信息,发现它最多可以存储“最高有符号值将是 2^31,即 2,147,483,648。”这能回答我自己的问题吗?
  • 12,345,678,912 > 2,147,483,648 ---> 整数溢出,如果你搜索这个词你就会知道哪里错了。

标签: c struct dynamic-memory-allocation


【解决方案1】:

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

您应该始终验证scanf 是否成功 - 它将返回成功分配的字段数,此处为1。所以你应该使用`if (scanf(...) != 1) { /handle error/ },而不是忽略它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多