嘿伙计们我正在学习c和我目前正在研究堆栈,结构和指针。我使用visual studio来完成我的程序,每当我输入我的输入时程序都会崩溃。我能够确定错误来自产品名称。我也很困惑,因为它包括指针字符。任何人都可以指出我的错误?谢谢
#include<stdio.h>
#include<string.h>
#define MAX 10
int top = -1;
struct Product {
int prodId;
char *prodName;
};
struct Product arrP[MAX];
struct Product pop();
void push(int id, char *name);
int isFull();
int isEmpty();
struct Product pop()
{
struct Product temp;
temp = arrP[top];
top--;
return temp;
}
void push(int id, char *name)
{
top++;
arrP[top].prodId = id;
strcpy(arrP[top].prodName,name);
}
int isFull()
{
if (top == MAX)
return 1;
else
return 0;
}
int isEmpty()
{
if (top == -1)
return 1;
else
return 0;
}
int main()
{
int myID;
char *myName;
//Push the value
printf("Enter the Product id: ");
scanf("%d", &myID);
printf("Enter the Product Name: ");
scanf("%s", &myName);
push(myID, &myName);
printf("%d %s", arrP[top].prodId ,arrP[top].prodName);
}
答案 0 :(得分:1)
在使用-Wall
标志进行编译时,可以避免我听到编译器警告的简单错误。
案例1: - 变量myId
假设是整数变量,而不是指针变量。如果你想让它成为指针变量,那么你应该首先为它分配内存。
int *myID;
printf("Enter the Product id: ");
scanf("%d", &myID);
替换为
int myID;
printf("Enter the Product id: ");
scanf("%d", &myID);
案例2: - 变量myName
应该是您想要将产品名称存储到其中的字符数组。
char myName;
printf("Enter the Product Name: ");
scanf("%s", &myName);
替换为
char myName[50];
printf("Enter the Product Name: ");
scanf("%s", myName);
调用push()
函数时,只需通过myName
。例如
push(myID, myName);
也是这句话
strcpy(arrP[top].prodName,name);
导致问题,因为prodName
是结构中的指针成员,你应该为此动态分配内存,然后进行复制。
arrP[top].prodName = malloc(SIZE);
strcpy(arrP[top].prodName,name);
答案 1 :(得分:0)
当您在字符类型变量中使用%s获取输入时,与char变量的地址相邻的内存会被覆盖,从而导致程序崩溃。如果你想输入一个字符串,你可以通过定义一个字符数组来尝试它(作为char我的名字[MAX],MAX可以是适合你的大小)。