指针无法解释地被修改

时间:2014-01-06 09:49:59

标签: c pointers input struct

我有一个指向结构的指针。

typedef struct anything{
    char text[MAXI];
    int any;
}Item;

在结构中接收到输入后,程序会请求用户在哪个集合中存储结构。

void adding(){
    Item *x = malloc(sizeof(Item));
    printf("Enter an integer.");
    scanf("%d", (&x->any));
    printf("Enter a string.");
    scanf("%s", (&x->text));
    printf("Which set would you like to add the Item to A/B?");
    char inp1 = 0;
    while ((inp1=0),scanf("%s", &inp1) == 1 && (inp1 !=  'A') && (inp1 != 'B')){
        printf("Set does not exist\n");
    }
        if('A' == inp1)
            add(A, x);
        else
            add(B, x);

    flush();
    instructs();
}

当接收输入(在while循环中)时,指针x正在从0x570ff8修改为0x57f00,然后指向垃圾而不是下面请求的输入。

为什么指针会被改变?

谢谢。

添加功能:

void add(Array *S,Item *x){
    bool rep = false;
    int i = 0;
    for(i = 0; i<=(S->size); i++){
        if(compStructs(*x,*(S->arr+i)))
            rep = true;
    }
    if(rep == false){
            x = realloc(S->arr, (S->size+1)*sizeof(Item));
            (S->size)++;
            printf("Item has been added");
    }
    else
        printf("The item is already in the set.");

}

2 个答案:

答案 0 :(得分:0)

一个错误是:

scanf("%s", (&x->text));

应该是

scanf("%s", x->text);

因为x->text已经是指针。

另一个错误是:

scanf("%s", &inp1)

应该是:

scanf("%c", &inp1)

因为你正在读一个字符。

答案 1 :(得分:0)

此:

  char inp1 = 0;

  while ((inp1=0),scanf("%s", &inp1) == 1 && (inp1 !=  'A') && (inp1 != 'B'))...

您正在使用字符串格式说明符(%s)但是要读取字符。即使您只键入单个字符,scanf也会尝试在&inp1指向的内存中存储以空字符结尾的字符串。

此内存位于堆栈中 - 指针x也是如此。因此x可能会scanf损坏sscanf。如果查看值的变化,您会看到地址的底部字节为零。这很可能是正在编写的空终结符。

要修复此问题,请将scanf("%c", &inp1) 更改为使用字符格式说明符: -

{{1}}