扫描中的分段错误和C中的打印字符串

时间:2015-11-12 01:22:53

标签: c string pointers segmentation-fault scanf

当我尝试仅使用INT参数时,它工作得很好,但是当我尝试使用字符串时,我总是得到“分段错误”,我不知道为什么。 我知道这可能是一个愚蠢的错误,但有人愿意向我解释,拜托吗?

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

typedef struct cliente{
    char *nome;
    int idade;
}t_cliente;


int main(){

    t_cliente *vet;
    int qtdCliente, i, j;

    scanf("%d", &qtdCliente);

    vet=(t_cliente*)malloc(qtdCliente*sizeof(t_cliente));

    for(i=0; i<qtdCliente; i++){
        scanf("%s", vet[i].nome);
        scanf("%d", &vet[i].idade); 
    }

    for(j=0; j<qtdCliente; j++){
        printf("%s\n", vet[j].nome);
        printf("%d\n", vet[j].idade);   
        printf("\n");
    }

    free(vet);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

vet=(t_cliente*)malloc(qtdCliente*sizeof(t_cliente));

(并且演员阵容在C中都是不必要的不明智)将为您提供一系列结构,每个结构包含两个字段nomeidade

但是,每个结构中的nome将设置为任意值,因此声明:

scanf("%s", vet[i].nome);

几乎肯定会尝试写入不应该写入的内存。

假设您知道第一个字段的最大大小,最好将其定义为:

#define MAXNOME 50
typedef struct cliente{
    char nome[MAXNOME];
    int idade;
}t_cliente;

这样,你试图写入的内存至少是有效的。

但是,使用scanf("%s",...)的人通常不会意识到这种做法有多糟糕。它可能导致缓冲区溢出问题,因为无法对将写入缓冲区的字符指定限制。有更安全的方法(获取用户输入),例如找到的here