Trying to create a list and display it.

typedef struct WinProc // Структура процессов windows { char process_name[10]; // имя int ram; // сколько оперативной памяти использует int percent0_100; // насколько нагружает процессор struct WinProc *next; // указатель на следующий элемент } WinProc; void push (WinProc **head, char name[10], int ram, int percent) { // Создаем новый узел WinProc *tmp = (WinProc*) malloc(sizeof(WinProc)); // Приписываем ему значения tmp->percent0_100 = name[10]; tmp->ram = ram; tmp->percent0_100 = percent; // Присваиваем указателю tmp адрес предыдущего узла tmp->next = (*head); // Присваиваем указателю head адрес нового узла (*head) = tmp; // После выхода из функции переменная tmp будет уничтожена. // Получим список, в который будет вставлен новый элемент. } void printLinkedList(const WinProc *head) { // вывод содержимого списка while (head) { printf("%d ", head->process_name[10]); printf("%d ", head->ram); printf("%d ", head->percent0_100); head = head->next; } printf("\n"); } void main() { WinProc* head = NULL; push(head, "proc1",10,10); push(head, "proc2",20,20); push(head, "proc3",30,30); printLinkedList(head); } 

I get the Segmentation fault as if I was accessing memory that was inaccessible to me.

  • Your push function parameter is WinProc *, and you are transmitting WinProc - Alexey Sarovsky
  • That is, pass the first parameter & head. Well, what else can I say is working with strings. cannot be assigned through =, change to copy (via strcpy/strncpy ) - Alexey Sarovsky

1 answer 1

Here is the corrected version

 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct WinProc // Структура процессов windows { char process_name[10]; // имя int ram; // сколько оперативной памяти использует int percent0_100; // насколько нагружает процессор struct WinProc *next; // указатель на следующий элемент } WinProc; void push (WinProc **head, char name[10], int ram, int percent) { // Создаем новый узел WinProc *tmp = (WinProc*) malloc(sizeof(WinProc)); // Приписываем ему значения memcpy(tmp->process_name, name, 10); tmp->ram = ram; tmp->percent0_100 = percent; // Присваиваем указателю tmp адрес предыдущего узла tmp->next = (*head); // Присваиваем указателю head адрес нового узла (*head) = tmp; // После выхода из функции переменная tmp будет уничтожена. // Получим список, в который будет вставлен новый элемент. } void printLinkedList(const WinProc *head) { // вывод содержимого списка while (head) { printf("%s ", head->process_name); printf("%d ", head->ram); printf("%d ", head->percent0_100); head = head->next; } printf("\n"); } int main() { WinProc* head = NULL; push(&head, "proc1",10,11); push(&head, "proc2",20,22); push(&head, "proc3",30,33); printLinkedList(head); } 

What we have changed here:

The function push first parameter has a pointer to a pointer, respectively, the call should be such a push(&head,..

Incorrect work with strings. instead of tmp->percent0_100 = name[10]; should be memcpy(tmp->process_name, name, 10); .

Well, an error in the output lines. You output them as a number printf("%d ", head->process_name[10]); . Must be printf("%s ", head->process_name); .

For check

  • Thank you so much! - Darth Nyan