该程序的任务是使用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作为编译器。
答案 0 :(得分:1)
s
st
初始化为NULL
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)
此代码错误:
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;