下面的C程序的输出是什么?
输出不应该是“我会被打印吗?”?相反,输出结果是一些垃圾值。为什么会这样?因为当您离开下面的C程序的输出是什么?,c,arrays,output,C,Arrays,Output,输出不应该是“我会被打印吗?”?相反,输出结果是一些垃圾值。为什么会这样?因为当您离开getString函数时,局部变量str超出范围 char *getString() { char str[] = "Will I be printed?"; return str; } int main() { printf("%s", getString()); getchar(); } 这是一份地方申报单。它受函数getString()中的限制。当您离开函数时,s
getString
函数时,局部变量str
超出范围
char *getString()
{
char str[] = "Will I be printed?";
return str;
}
int main()
{
printf("%s", getString());
getchar();
}
这是一份地方申报单。它受函数getString()
中的限制。当您离开函数时,str[]
将被折叠
因此,您正在尝试打印它的数据。显然,你将垃圾价值
为了避免这种情况-
char str[] = "Will I be printed?";
现在
str
将存储在代码内存中,当您离开函数时,str
将不会被折叠。现在它将打印我将被打印吗?
str数组位于getString()
函数(local scope)中。与所有局部变量一样,它的存储通常在堆栈上分配
因此,在返回时,它将被自动解除分配。您正在函数
getString
的范围内声明一个局部变量。当函数结束时,在返回值之前,该变量str
的内存被释放并清理,因为作用域已结束
现在,该函数将地址返回到此已清理内存。在许多情况下,当您访问内容时,内容已经被其他进程覆盖。因此它看起来像垃圾值。您返回的是局部变量的地址,这是禁止的,但您可以通过以下方式返回字符串文字:
char *str = "Will I be printed?";
或
或
这里的
char str[]
是局部变量(自动)。在您的案例中,变量的作用域仅限于函数getString。
因此,在函数getString
之外访问str
的地址将导致未定义的行为
但是代码可以如下所示进行更正
char *getString()
{
static char str[] = "Will I be printed?";
return str; /* read - write */
}
这三种功能之间有很大区别
char *getString()
{
char *str = "Will I be printed?";
return str;
}
int main()
{
printf("%s", getString());
getchar();
}
使用第一个函数会导致未定义的行为,尽管在大多数情况下会输出字符串
char *getString()
{
char str[] = "Will I be printed?";
return str;
}
char *getString()
{
static char str[] = "Will I be printed?";
return str;
}
char *getString()
{
char *str = "Will I be printed?";
return str;
}
因为对于这个简单的程序,堆栈可能不会被覆盖
最后两个函数定义良好,因为返回的字符数组和字符串文本指针具有静态存储持续时间。因此,退出函数后,这两个对象都将处于活动状态。一旦退出函数,str的值将是自由的,您应该使用:
Will I be printed?
您应该了解一些有关堆栈和堆的知识
char *getString()
{
char str[] = "Will I be printed?";
return str;
}
char *getString()
{
static char str[] = "Will I be printed?";
return str;
}
char *getString()
{
char *str = "Will I be printed?";
return str;
}
Will I be printed?
char *str = "Will I be printed?";
return str;