当我在case 2
之后调用case 1
(换句话说,在一个while
循环之后)时,下面的代码会产生两个笑脸。但是,printSentence();
的工作方式与case 1
中的工作方式相同。
#include <stdio.h>
#include <string.h>
char *enterSentence();
void printSentence(char *);
char *sentence;
int willContinue = 1;
main() {
while (willContinue) {
int a;
scanf("%d", &a);
switch (a) {
case 1:
getchar();
sentence = enterSentence();
printSentence(sentence);
break;
case 2:
getchar();
printSentence(sentence);
break;
case 3:
willContinue = 0; //exit
break;
}
}
}
char *enterSentence() {
char temp[999];
gets(temp);
return temp;
}
void printSentence(char *asd) {
puts(asd);
}
.
. //more code
.
我想知道这里有什么问题,感谢您的帮助..
答案 0 :(得分:5)
temp
local 到函数enterSentence
。它是在输入函数时创建的,并在函数终止时被销毁。
当你返回对象的地址(return temp;
)时,它仍然存在且具有该地址,但之后会立即销毁,并且调用函数会收到指向无效位置的指针。
快速而肮脏的解决方案:使temp
成为自程序启动以来可以存活的静态对象
static char temp[999];
注意:正如我所说,static
是一个快速而肮脏的解决方案。最好避免使用它。
修改
缓慢而干净的解决方案:将temp
对象移动到调用函数并将其指针传递给函数
int main(void) {
char temp[999];
/* ... */
enterSentence(temp, sizeof temp);
/* ... */
}
size_t enterSentence(char *dst, size_t len) {
size_t retlen;
fgets(dst, len, stdin);
retlen = strlen(dst);
if (dst[retlen - 1] == '\n') dst[--retlen] = 0;
return retlen;
}
答案 1 :(得分:0)
sentence
中存储的先前值保持不变。