2010-12-02 1 views
1

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

Вот код:

#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 как компилятор.

+3

И я ожидаю, что вы будете просить вопрос в любую минуту ... – abelenky 2010-12-02 18:59:03

+0

@abelenky - это довольно ясно, что ошибка сегментации является проблема – 2010-12-02 19:08:56

+1

@Steve Townsend: большинство обычных пользователей SO получили очень ясно что им больно, «задавайте вопросы типа« Код-дамп, пожалуйста, исправьте ». Мы все хотим увидеть с плаката: Что вы ожидали? Что вы на самом деле получаете? Что вы пробовали и где вы застряли?Когда люди задают реальные вопросы, легче дать реальные ответы. – abelenky 2010-12-02 19:20:30

ответ

1

Этот код является неправильным:

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

snew->s не инициализируется, когда вы memcpy a в него. Я бы ожидал увидеть два malloc s - один для 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
  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 ..

1

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

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

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

0
#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; 
Смежные вопросы