Выгрузка данных из структуры в стек в C - PullRequest
1 голос
/ 02 декабря 2010

Задача программы - поместить все данные из структуры в стек, используя memcpy. После выполнения он успешно вводит данные в структуру, но достигает ошибки сегментации, когда дело касается функции push().

Вот код:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <mem.h>

typedef struct STD {
   char ime [50];
   int fn;
   float usp;
   } STD;


 typedef struct STACK {
    STD *s;
    STACK *next;

    } STACK;
  int push (void *a, int siz,  STACK **sst) {
STACK *snew;
snew = (STACK *) malloc (siz + 1);
memcpy (snew->s, a, siz); 
 snew -> next = *sst;
 *sst = snew;


 }

int main () {
STACK *st;
STD  ss;

printf ("Vyvedi ime");
gets (ss.ime);
ss.ime[49] = 0;
printf ("Vyvedi fn");
scanf ("%d", &ss.fn);

printf ("Vyvedi usp");
scanf ("%f", &ss.usp);



push (&ss, sizeof(ss) , &st);



system ("pause");      }

Не знаю, имеет ли это значение, я использую DevC в качестве компилятора.

Ответы [ 4 ]

1 голос
/ 02 декабря 2010

Этот код неверен:

STACK *snew;
snew = (STACK *) malloc (siz + 1);
memcpy (snew->s, a, siz); 

snew->s не инициализируется, когда вы memcpy a в него. Я ожидаю увидеть два malloc с - один для STACK*, а другой для STD*, который вы затем использовали бы для заполнения snew->s перед копированием в него содержимого.

STACK *snew;
snew = (STACK *) malloc (sizeof(STACK));
snew->s = (STD*) malloc(sizeof(STD));
memcpy (snew->s, a, siz);

В качестве альтернативы вы можете использовать один malloc и указать snew->s на соответствующее смещение внутри него (после того, как вы оставили место для STACK struct).

STACK *snew;
snew = (STACK *) malloc (sizeof(STACK) + siz + 1);
snew->s = (char*)snew + sizeof(STACK);
memcpy (snew->s, a, siz);

Параметр siz в вашей функции push кажется излишним, поскольку вы всегда передаете struct STD.

1 голос
/ 02 декабря 2010

Вот что вы делаете, Даламар:
1. Если у вас есть отладчик, и вы знаете, как его использовать, выполните шаг через функцию push (), чтобы увидеть, где происходит ошибка сегментации.
2.В противном случае поместите оператор printf между каждой строкой в ​​push ():

printf ("1\n") ;  
...  
printf ("2\n") ;  
...  

Это также скажет вам, где происходит ошибка сегментации.
Если вы все еще застряли, то вернитесь к нам сновая информация.

1 голос
/ 02 декабря 2010
  1. обратите внимание, что вы не выделяете место для s
  2. вам нужно инициализировать st до NULL
  3. Пожалуйста, убедитесь, что snew не NULL

т.е.

int push (void *a, int siz,  STACK **sst) {
  STACK *snew (STACK *) malloc (siz + 1);
  snew->s = (STD *) mallos (sizeof(STD)); // <-----------
  memcpy (snew->s, a, siz); 
  snew -> next = *sst;
  *sst = snew;
 }

И, похоже, там есть другие проблемы, начните использовать значимые имена, а не ss, st ..

0 голосов
/ 27 апреля 2011
#include <iostream>
#include <stdlib.h>
#include <conio.h>

#include "linkedlist.h"
int main(int argc, char *argv[])
{
 LinkedList myList;
 Node *node  ;
 int choice = 0 , index=0 ;
 string agentName, caseDesc ;
 int caseNo;
 do
 {

     cout<< "\n Enter 1 Add a new node to the end \n";
     cout<< " Enter 2 Add a new node to the beginning \n";
     cout<< " Enter 3 Print out the entire list \n";
     cout<< " Enter 4 Remove a node from the list \n";
     cout<< " Enter 5 Quit the program \n";
     cout<< " Enter your choice : ";
     cin>> choice;
     switch(choice){
       case 1:
                   //  Insert appropriate code here ....
       break;

       case 2:
                   //  Insert appropriate code here ....
       break;

       case 3:
                   //  Insert appropriate code here ....
       break;

       case 4:
                   //  Insert appropriate code here ....        
       break;

       case 5:
         exit(1);
       break;      

       default :
         cout<<"\n   Invalid Option, Please try again .....\n";
       break;

     }

 }while (true);




 system("PAUSE");   
 return 0;
...