【问题标题】:Pointer unexplainably being Modified指针莫名其妙地被修改
【发布时间】:2014-01-23 16:36:45
【问题描述】:

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

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.");

}

【问题讨论】:

  • (inp1=0) 那么什么时候(inp1=0) 会是'A'?或者这个修改不是一个单一的序列?
  • 显示add()的代码。
  • inp1 用于确保 scanf 读取 1 个项目。 inp1!= A 和 inp!= B 也用于在输入无效输入时通知用户。

标签: c pointers input struct


【解决方案1】:

这个:

  char inp1 = 0;

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

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

此内存在堆栈上 - 就像您的指针 x 一样。所以x 可能被scanf 破坏了。如果您查看值的变化,您会看到地址的底部字节为零。这很可能是正在写入的空终止符。

要解决此问题,请将您的 sscanf 更改为使用字符格式说明符:-

scanf("%c", &inp1) 

【讨论】:

  • 感谢您的明确答复。我现在遇到的一个相对较小的问题是,在请求用户输入之前,while 循环中的 printf 被访问了 1 次。此外,当用户输入由 while 循环指定的无效输入时,printf 将被打印 2 次。
  • @user2035045 - 那是因为前两个scanfs 在输入缓冲区中留下了一个换行符。您最好使用fgets(),然后使用sscanf。看到这个问题。 stackoverflow.com/questions/5918079/…
【解决方案2】:

一个错误是:

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

应该是

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

因为x-&gt;text已经是一个指针了。

另一个错误是:

scanf("%s", &inp1)

应该是:

scanf("%c", &inp1)

因为您正在阅读单个字符。

【讨论】:

  • 我之前用过scanf("%s", (x->text));但我收到了 SIGSEGV 分段错误错误。
  • @user2035045 MAXI 是什么?
猜你喜欢
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多