一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

1.VS运行程序,出现“烫烫烫烫烫烫烫烫烫…”
在 Debug 模式下,
VC 会把未初始化的栈内存全部填成 0xcc,当字符串看就是 烫烫烫烫……
会把未初始化的堆内存全部填成 0xcd,当字符串看就是 屯屯屯屯……

2. VS不可以char *p=“abcd”
注意:编译器是把"abcd"作为“abcd\0”来处理的,有五个字符
为什么要加上’\0’?,‘\0’代表空格符,在字符串结尾加上‘\0’,代表字符串已经结束,读到\0的时候会停下来,不然会沿着内存地址一直读下去,读到什么乱七八糟的东西就不知道了,比如会读到类似 “烫烫烫烫”的东西

原因——“abcd”是字符串常量,不可更改,必须加上const用常量指针,即 const char *p = “abcd”
const char *p="hello"分配在静态存储区,不可以改变.
char p[]="hello"分配在堆上.

3.char *、char []、const char *、string 的区别
const char * 只是说指针指向的内容不可变,但指针本身可以再赋值

注意:看const 是放在*的左边还是右边 看const是修饰指针变量,还是修饰所指向的内存空变量

1 const char *p1 ; char * const p1 ; const char * const p1; //三者都不一样
2 const int a; int const b;      //const修饰 a b意义相同
3 const char *c;                 //const修饰c所执行的内存空间,c所值得内存空间不能被修改
4 char * const d;             //d是一个常量指针;

1.char * //字符指针,指向字符的指针

2.const char *,字符串常量,即像"aaa"这样的类型

3.string 是std::basic_string模板类的实例化,是一个类(C++的STL才有),string str=“aaa”; 其实是 const char *转class ,string重载了=号,把“aaa”封装成std::string

4.char a[8]; // a的类型是 char [8],如果是char a[6]; 则a的类型就是char [6] 既长度为N的字符数组

4.char *、char []、const char *、string 的转换

转化规律总结下:

1.转化成char[],可以用strcpy_s ,或者遍历字符串的方式
string 转char[] : strncpy_s(a, string.c_str(), N); 也可以用上图的遍历string
const char * 转char[] : strcpy_s(a, const char *); 也可以用上图的strncpy_s
char * 转char[] : strcpy_s(a, char *); 也可以用上图的strncpy_s

2.char[]变成别的,直接赋值

3.转化为std::string 最简单,可以直接=, 因为string太强大了,把=号重载了很多遍

4.const char *转化到 char * 使用const_cast<char *>

5.string转化为char * 用c_str()

5.函数返回指向局部变量的指针,其指向的内容若不被保护,将会被系统回收内存(篡改内存数据)

复制代码
 1 #include "stdlib.h"
 2 #include "string.h"
 3 #include "stdio.h"
 4 
 5 #define _CRT_SECURE_NO_WARNINGS
 6 
 7 const char *getStr1()
 8 {
 9     const char *p = "abcd";
10     printf("%s\n%p\n", p,p);
11     return p;
12 }
13 
14 char *getStr2()
15 {
16     char str[] = "abcd";
17     char *p = str;
18     printf("%s\n%p\n", p, p);
19     return p;
20 }
21 
22 void main(void)
23 {    
24     printf("getStr1():%s\n", getStr1());
25     printf("getStr2():%s\n", getStr2());
26 
27     system("pause");
28 }
复制代码

1.getstr1(): const在编译时候就确定好地址,其指向的内容不可更改。

 2.getstr2(): char[]数组作为局部变量,在函数返回时内存会被系统回收,数据遭到篡改,无参考价值。

posted on   一杯清酒邀明月  阅读(1292)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2020-08-04 Qt 让Label显示图片并把图片居中
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示