我有一个指向结构的指针。
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.");
}
答案 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}}