Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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
在这种情况下,char[]和char*有何不同?_C_String_Pointers_Dangling Pointer - Fatal编程技术网

在这种情况下,char[]和char*有何不同?

在这种情况下,char[]和char*有何不同?,c,string,pointers,dangling-pointer,C,String,Pointers,Dangling Pointer,当我们运行这段代码时,它工作正常,并在屏幕上打印string constant: char *someFun(){ char *temp = "string constant"; return temp; } int main(){ puts(someFun()); } 但当我们运行以下类似代码时,它将无法工作,并在屏幕上打印一些垃圾: char *someFun1(){ char temp[ ] = "string"; return temp; } i

当我们运行这段代码时,它工作正常,并在屏幕上打印
string constant

char *someFun(){
    char *temp = "string constant";
    return temp;
}
int main(){
    puts(someFun());
}
但当我们运行以下类似代码时,它将无法工作,并在屏幕上打印一些垃圾:

char *someFun1(){
    char temp[ ] = "string";
    return temp;
}
int main(){
    puts(someFun1());
}

背后的原因是什么?本质上,这两个函数做相似的事情(即返回一个“字符串”),但它们的行为仍然不同。为什么会这样?

在第一种情况下,指针
temp
将指向存储
字符串常量的全局常量。因此,当您返回指针时,它是有效的


在第二种情况下,“string”只是堆栈上的一个字符数组,它在您从函数返回后消失。

在第一种情况下,指针
temp
将指向一个全局常数,该全局常数存储
“string constant”
。因此,当您返回指针时,它是有效的

char *temp = "string constant";
在第二种情况下,“string”只是堆栈上的一个char数组,它在从函数返回后消失

char *temp = "string constant";
字符串常量
文本驻留在只读段上。它在程序终止时被释放。因此,您可以有一个指向它的引用

char temp[ ] = "string";
string
被复制到驻留在堆栈上的
temp
。当函数返回时,堆栈开始展开,从而取消分配函数范围中的变量。但您正在返回一个对它的引用,该引用在堆栈上不再存在,因此您将得到垃圾。但有时你仍然可以得到正确的结果,但你不应该依赖它

字符串常量
文本驻留在只读段上。它在程序终止时被释放。因此,您可以有一个指向它的引用

char temp[ ] = "string";

string
被复制到驻留在堆栈上的
temp
。当函数返回时,堆栈开始展开,从而取消分配函数范围中的变量。但您正在返回一个对它的引用,该引用在堆栈上不再存在,因此您将得到垃圾。但有时您仍然可以得到正确的结果,但不应该依赖它。

为什么在第一种情况下,它存储在全局堆中,而在第二种情况下,它存储在本地堆栈中?默认情况下,字符串文本是全局存储的。(不是在堆上,而是在程序内存中)但是,当您声明char[]时,您可以将字符串作为
{'s','t','r','i','n','g}
。。。。包括空终止符。为什么在第一种情况下它存储在全局堆中,而在第二种情况下它存储在本地堆栈中?默认情况下,字符串文本是全局存储的。(不是在堆上,而是在程序内存中)但是,当您声明char[]时,您可以将字符串作为
{'s','t','r','i','n','g}
。。。。在
put()
中包含空终止符。参数、返回地址和帧指针等控制信息以及局部变量可能使用了
someFun1()
中局部变量(数组)以前使用的空间,为了避免处理字符串文字时出现问题,您应该将指向它们的指针存储在
const char*
变量中,这样,如果您试图修改它们,编译器将阻止您。参数、返回地址和帧指针等控制信息,以及
put()中的局部变量
可能正在使用
someFun1()
中局部变量(数组)以前使用的空间。顺便说一句,为了避免处理字符串文字时出现问题,您应该将指向它们的指针存储在
const char*
变量中,因此如果您试图修改它们,编译器将阻止您。