在C中将数据从结构推送到堆栈中

时间:2010-12-02 18:56:59

标签: c data-structures segmentation-fault stack push

该程序的任务是使用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 个答案:

答案 0 :(得分:1)

  1. 请注意,您没有为s
  2. 分配空格
  3. 您需要将st初始化为NULL
  4. 请检查snew不是NULL
  5. 即。

    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;
     }
    

    看起来还有其他问题,开始使用有意义的名称,而不是ssst ..

答案 1 :(得分:1)

此代码错误:

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

malloc未初始化。我希望看到两个STACK* s - 一个用于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}}。

答案 2 :(得分:1)

这就是你做的事,Dalamar:
1.如果您有调试器,并且知道如何使用它,则逐步执行push()函数以查看发生分段故障的位置。
2.否则,在push()中的每一行之间放一个printf语句:

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

这也将告诉您分段故障发生的位置 如果您仍然卡住了,请使用新信息回复我们。

答案 3 :(得分: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;