Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
下面的C程序的输出是什么?_C_Arrays_Output - Fatal编程技术网

下面的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;