程序结束后返回值3221225477

时间:2016-03-15 02:59:39

标签: c segmentation-fault return-value

我正在学习如何在C中编码。 我必须为一个人创建一个记录,包括生日和身份证号码 代码由3个文件组成

拳头是标题

    // definição do tipo
typedef int vetor[10];

typedef struct 
{
    char nome[50];
    vetor nasceu;
    vetor cpf;
} dados ;

void cadastro (dados*, char[50], vetor, vetor);

然后是标题

的定义
#include <stdio.h>
#include <string.h>
#include "cadastro.h"

void cadastro (dados *usuario, char name[50], vetor ddn, vetor cpf)
{
    int i;
    strcpy(usuario->nome,name);
    for (i = 0; i < 50; i++)
    {
        usuario->nasceu[i] = ddn[i];
    }
    for (i = 0; i < 10; i++)
    {
        usuario->cpf[i] = cpf[i];
    }
}

,最后一个文件使用标题生成记录

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cadastro.h"

int preenche_cadastro (char a[],vetor b,vetor c)
{
    int i;
    printf ("inserir nome: ");
    gets (a);
    printf("inserir data de nascimento (campos separados por espaco): ");
        for (i = 0; i < 3; i++)
        {
            scanf("%d",&b[i]);
        } 
    printf ("inserir CPF (campos separados por espaco): ");
    for (i = 0; i < 4; i++)
    {
        scanf("%d",&c[i]);
    }
    return (0);
}

int imprime_cadastro (dados usuario)
{
    printf("\nnome: %s",usuario.nome);
    printf("\ndata de nascimento: %d / %d / %d\n", usuario.nasceu[0],usuario.nasceu[1],usuario.nasceu[2]);
    printf("CPF:  %d . %d . %d - %d\n", usuario.cpf[0],usuario.cpf[1],usuario.cpf[2],usuario.cpf[3]);
    return(0);
}

int main(void) 
{
    dados new_entry;
    char name[50];
    vetor born, cpf;
    int i;
    preenche_cadastro (name,born,cpf);
    cadastro(&new_entry, name, born, cpf);
    imprime_cadastro(new_entry);
    return (0);
}

我真的不知道如何调试,但据我所知,“分段错误”只发生在

return (0);

我在这里生气,有人可以帮助我吗?

  抱歉我的英语,这不是母语

3 个答案:

答案 0 :(得分:3)

你的第一个循环应该只复制10个项而不是50个。

    for (i = 0; i < 10; i++)
    {
        usuario->nasceu[i] = ddn[i];
    }

答案 1 :(得分:3)

您通过访问行中超出范围的数组来调用未定义的行为

usuario->nasceu[i] = ddn[i];

在函数cadastro中,然后程序发生在那里崩溃。

不要调用未定义的行为。不应使用幻数10,而应定义数组中的元素数量并使用它。

另请注意,使用具有自动存储持续时间且未确定的未初始化变量的值也会调用未定义的行为

更正了标题:

// definição do tipo
#define VETOR_NUM 10
typedef int vetor[VETOR_NUM];

typedef struct 
{
    char nome[50];
    vetor nasceu;
    vetor cpf;
} dados ;

void cadastro (dados*, char[50], vetor, vetor);

更正了cadastro的实施:

#include <stdio.h>
#include <string.h>
#include "cadastro.h"

void cadastro (dados *usuario, char name[50], vetor ddn, vetor cpf)
{
    int i;
    strcpy(usuario->nome,name);
    for (i = 0; i < VETOR_NUM; i++)
    {
        usuario->nasceu[i] = ddn[i];
    }
    for (i = 0; i < VETOR_NUM; i++)
    {
        usuario->cpf[i] = cpf[i];
    }
}

更正main()功能:

int main(void) 
{
    dados new_entry;
    char name[50];
    vetor born = {0}, cpf = {0}; /* initialize arrays */
    /* i is removed because it wasn't used */
    preenche_cadastro (name,born,cpf);
    cadastro(&new_entry, name, born, cpf);
    imprime_cadastro(new_entry);
    return (0);
}

还有一点需要注意:您不应该使用gets(),这有不可避免的缓冲区溢出风险。

答案 2 :(得分:2)

cadastro函数中的此循环:

for (i = 0; i < 50; i++)
{
    usuario->nasceu[i] = ddn[i];
}

似乎不符合nasceu arrary的大小:

typedef int vetor[10];

typedef struct 
{
    char nome[50];
    vetor nasceu;
    vetor cpf;
} dados ;

您是否尝试过更改为:

for (i = 0; i < 10; i++)
{
    usuario->nasceu[i] = ddn[i];
}