【发布时间】:2024-04-12 04:05:03
【问题描述】:
我的代码如下:
char* int2str(int val);
void main(){
char *s = int2str(1001);
printf("----s=%s\n",s);
}
char* int2str(int val){
char turnStr[10];
sprintf(turnStr, "%d", val);
//printf("turnStr=%s\n",turnStr);
return turnStr;
}
上面的代码打印出空字符串,但是当我取消注释时:printf("turnStr=%s\n",turnStr)
它能够打印出正确的字符串。
我知道函数结束时堆栈空间无法返回,但是我很困惑当我添加printf("turnStr=%s\n",turnStr)时,它可以打印出字符串。
【问题讨论】:
-
你对
sprintf的包装实际上在这里是一个巨大的负担。如果必须,请直接使用sprintf,或者改为使用printf。 -
令人惊讶的是人们没有很好地阅读这个问题。你的问题是“为什么 它起作用了?”而其他人都回答“为什么它不起作用?”。
-
@DavidG。这取决于你对“工作”的定义
-
@M.M 在这种情况下,输出“----s=1001”的行是“工作”。他问为什么会出现这种情况,而不是在我的一个案例中,添加了 C 转义符,“-----s=\x98\x06@”
-
这(为什么会起作用)是 C 标签下方最常见的常见问题解答之一,但有 5 人发布了答案……有些答案甚至没有回答问题。对于那些不知道的人,我们有一组规范的欺骗目标,您可以/应该在这些情况下使用。检查C tag wiki,向下滚动到常见问题解答。
标签: c scope undefined-behavior c-strings storage-duration