将值推送到结构时堆栈崩溃

时间:2018-06-11 10:46:56

标签: c

嘿伙计们我正在学习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);

}

2 个答案:

答案 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可以是适合你的大小)。