Как инициализировать значения структуры и правильно вывести структуру - PullRequest
1 голос
/ 12 июля 2019

Я пытаюсь сделать домашнее задание и не знаю, куда идти, или я на правильном пути, чтобы сделать это правильно.Эта программа была дана мне с целью создания функции для создания нового узла с массивом, достаточно большим для хранения входного «счетчика».Оттуда я предполагаю, что должен вывести созданный узел.

Я попытался настроить узел несколькими способами с разными указателями, хотя я не уверен, как правильно инициализировать 'newnode'.И каждый раз, когда я пытаюсь использовать ввод 'count', такой как 'newnode-> array_length = count;'Я получаю ошибку сегментации, но не понимаю, почему, если в функцию введен счетчик, разве он не может быть использован в этой области?

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

typedef struct node {
    struct node* previous;
    struct node* next;
    int array_length;
    int* values;
} node;

//creates a new node with an array large enough to hold `count` values
node* create_node(int count) {
//your code here:
    node* newnode;
    newnode = (node*) malloc(sizeof(node));
    newnode->array_length = count;
    newnode->values;
    newnode->next=NULL;
    newnode->previous=NULL;

    return newnode;
}

void append(node* a, node* b) {
    assert(a);
    assert(b);
    a->next = b;
    b->previous = a;
}

int main() {
    node* a = create_node(10);

    assert(a->array_length == 10);
    assert(a->next == NULL);
    assert(a->previous == NULL);

    node* b = create_node(20);

    assert(b->array_length == 20);
    assert(b->next == NULL);
    assert(b->previous == NULL);

    append(a, b);

    assert(a->next == b);
    assert(b->previous == a);
    assert(a->previous == NULL);
    assert(b->next == NULL);

    for(node* cur = a; cur != NULL; cur = cur->next) {
        for(int i = 0; i < cur->array_length; i++) {
            cur->values[i] = i;
        }
    }
}

Ошибки компиляции:

problem2.c: In function ‘create_node’:
problem2.c:20:30: warning: implicit declaration of function ‘size’ [-Wimplicit-function-declaration]
     newnode->values = malloc(size(int) * count);
                              ^~~~
problem2.c:20:35: error: expected expression before ‘int’
     newnode->values = malloc(size(int) * count);
                                   ^~~

1 Ответ

1 голос
/ 12 июля 2019

Вы не выделяете память для values.По умолчанию он установлен на любую память, которая была раньше, что, вероятно, было неверным указателем.Это может привести к segfault при попытке доступа к values.

//creates a new node with an array large enough to hold `count` values
node* create_node(int count) {
//your code here:
    node* newnode = malloc(sizeof(node));
    newnode->array_length = count;
    newnode->values = malloc(sizeof(int) * count);   // malloc memory for values
    newnode->next = NULL;
    newnode->previous = NULL;

    return newnode;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...