字符串与指针傻傻分不清楚

时间:2022-01-26 12:42:54

#include <iostream>
#include <stdio.h>

using namespace std;

char* he()
{
    char buf[] = "Hello world";
    return buf;
}

int main()
{
    cout << he() << endl;  //C++打印出来的结果
    printf("%s", he());  //C打印出来的结果
    return 0;
}

运行环境:wind10(64位),i7,8G内存,CodeBlocks16.01 。

请问各位大神打印出来的结果为如下图所示,为什么呢?不应该都是“Hello world”吗?
字符串与指针傻傻分不清楚

9 个解决方案

#1


完美世界笔试题 字符串与指针傻傻分不清楚

#2


是啊   怎么破? 字符串与指针傻傻分不清楚

#3


字符串与指针傻傻分不清楚理解讨论之前请先学会如何 观察

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

#4


字符串与指针傻傻分不清楚


同求解

字符串与指针傻傻分不清楚

#5


因为你buf是局部变量,出了函数就已经释放,崩溃都是正常,好好补下基础
你在函数里new然后再赋值就知道了

#6


自定义变量,都是在模块运行完自动释放。
你返回自定义变量的指针,指针所指向的内容,会在程序返回后释放。
所以返回的值是不确定的。

栈,这个是程序自动分配的,所以内容有可能会跟之前调用重复或者乱码。

#7


这个,我也懵逼了

#8


栈中的变量通常包括函数参数和函数里声明的临时变量。
栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。
而栈中的类变量退出其作用域时,会自动执行其析构函数,……

其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

#9


好的,完全明白了。

真心的谢谢大家! 字符串与指针傻傻分不清楚字符串与指针傻傻分不清楚字符串与指针傻傻分不清楚

本人C/C++初学者,望大家多多指教,以后还会很多交流的。谢谢。

#1


完美世界笔试题 字符串与指针傻傻分不清楚

#2


是啊   怎么破? 字符串与指针傻傻分不清楚

#3


字符串与指针傻傻分不清楚理解讨论之前请先学会如何 观察

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

#4


字符串与指针傻傻分不清楚


同求解

字符串与指针傻傻分不清楚

#5


因为你buf是局部变量,出了函数就已经释放,崩溃都是正常,好好补下基础
你在函数里new然后再赋值就知道了

#6


自定义变量,都是在模块运行完自动释放。
你返回自定义变量的指针,指针所指向的内容,会在程序返回后释放。
所以返回的值是不确定的。

栈,这个是程序自动分配的,所以内容有可能会跟之前调用重复或者乱码。

#7


这个,我也懵逼了

#8


栈中的变量通常包括函数参数和函数里声明的临时变量。
栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。
而栈中的类变量退出其作用域时,会自动执行其析构函数,……

其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

#9


好的,完全明白了。

真心的谢谢大家! 字符串与指针傻傻分不清楚字符串与指针傻傻分不清楚字符串与指针傻傻分不清楚

本人C/C++初学者,望大家多多指教,以后还会很多交流的。谢谢。