C函数之间传递字符串
问题描述:
我正在用C编写简单的程序,并得到了stucked。我有三个功能:C函数之间传递字符串
void changeStatusOfBook(User users[], Book books[]) {
char *id= askForBookID();
Book book = getBookById(books, id);
.
.
.
}
char * askForBookID() {
char id[6];
printf("Tell me which book (ID)\n");
scanf_s("%5s",id, 6);
return id;
}
Book getBookById(Book books[], char bookID[]) {
int counter = 0;
//bookID becomes a trash here
.
.
.
}
的问题是:在第一个功能,我得到正确的用户输入的字符串,但是当我将它传递给第三个功能我得到它的一些垃圾。如何解决它?
答
您不能从函数返回本地变量char id[]
。它的内存位于堆栈上,并且函数返回该函数的所有堆栈内存并且其局部变量不再可访问。
当堆栈上的内存需要另一个程序时,它会覆盖char id
的内存空间,这对您的程序来说会成为问题。
char * askForBookID() {
//char id[6];
char *id = malloc(sizeof(char)*6);
if(!id){ //check if malloc got some memory for id
printf("Sorry not enough memory"); return NULL;
}
printf("Tell me which book (ID)\n");
scanf_s("%5s",id, 6);
return id;
}
答
函数askForBookID返回具有自动存储持续时间的数组的第一个元素的地址。
您使用该指针oncce函数的行为被称为未定义。
改用malloc代替。
编译所有警告和调试信息。请注意,当作为参数传递时,数组会衰减为指针。 –