在这种情况下,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*
变量中,因此如果您试图修改它们,编译器将阻止您。