将scanf值传递给struct pointer Segmentation Fault

时间:2017-03-11 19:31:29

标签: c pointers struct segmentation-fault scanf

我想做的只是使用用户输入的结构指针进行基本打印。当我尝试使用下面的代码时,我得到了segmentation fault。不管怎么说,我是c的新手。

typedef struct {
    int *licenseNum;
    char *name;
    char *region;
} City;

typedef struct {
    struct Node *current;
    struct Node *head;
    struct Node *tail;
    struct Node *next;
    struct Node *secondNext;
    City *data;
} Node;


int main()
{
    Node *node = malloc(sizeof(Node));
    City *city = malloc(sizeof(City));
    puts("License number of the City: ");
    scanf("%d", &(node -> data -> licenseNum));
    printf("%d", node -> data -> licenseNum);
    return 0;
}

3 个答案:

答案 0 :(得分:0)

您未在data中设置node

Node * node = malloc(sizeof(Node));
City * city = malloc(sizeof(City));
// node->data is not yet defined!
// It has a random value! You must first initialize it:
node->data = city;

此外,您不应在此使用malloc,因为malloc分配的内存具有随机值。如果您确实在使用malloc之前使用有意义的值初始化所有指针,请仅使用struct。使用calloc

更安全
Node * node = calloc(1, sizeof(Node));
City * city = calloc(1, sizeof(City));
node->data = city;

calloc的工作方式与malloc类似,但它保证返回的内存全部设置为零(所有int值均为0,所有指针均为NULL)。 calloc(上面代码中的1)的第一个参数是您要分配的项目数,这里只是一个。例如。 calloc(5, sizeof(City))将在一个块中为5个城市分配内存,例如:

Cities * cities = calloc(5, sizeof(City));
cities[0].name = "New York";
cities[1].name = "London";
// ... and so on

答案 1 :(得分:0)

您没有初始化node->data

答案 2 :(得分:0)

您为node分配了内存,但没有为node->data分配内存。

你可能想这样做:node->data = city