【问题标题】:pass scanf value to struct pointer Segmentation Fault将 scanf 值传递给结构指针 Segmentation Fault
【发布时间】:2017-08-02 01:17:59
【问题描述】:

我想做的只是使用用户输入使用结构指针进行基本打印。当我尝试使用以下代码时,我得到了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;
}

【问题讨论】:

    标签: c pointers struct segmentation-fault scanf


    【解决方案1】:

    你没有在node中设置data

    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分配的内存有随机值。如果您确定在使用之前使用有意义的值初始化 struct 中的所有指针,请仅使用 malloc。使用calloc更安全:

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

    callocmalloc 一样工作,但它保证返回的内存全部设置为零(所有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
    

    【讨论】:

    • 他不应该使用free(node)free(city)来释放动态分配的资源吗?
    • @SatyaPawan 是的,他应该这样做,但这不是问题的一部分。这将是“为什么我的代码泄漏内存?”问题的一部分。 ;-) 对于只执行一个操作然后像退出一样退出的应用程序,内存泄漏不一定很重要,应用程序的所有分配内存总是返回给操作系统并因此隐式释放,所以调用会有什么不同free 在应用退出前两次?这没什么区别。如果您打算让您的应用程序运行数小时,您当然必须预算内存 - 或者接受您的应用程序需要 GB 的内存:-P
    • @Mecki 感谢您的回复。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你没有初始化node->data

      【讨论】:

        猜你喜欢
        • 2020-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多