首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【错误记录】C 语言中通过指针操作字符串常量出错记录 ( 只有 栈内存 或 堆内存 中的数据才能通过指针修改 | 不要通过指针修改常量区的字符串 )

// 从两边向中间遍历 // 利用指向收尾的指针 , 交互指针指向的元素 while (p_start < p_end) { // 交换收尾字符...// 记录 p_start 指针指向的首部字符 char c = *p_start; // 将尾部字符赋值给首部字符 *p_start = *p_end;...// 将首部字符赋值给尾部字符 *p_end = c; // 指向头部的指针自增 p_start++; // 指向尾部的指针自减...char *str = "sdfsdfsdabc4548411abc"; 字符串导致 , 该字符串存储在 全局区 的 常量区 ; char *str 指针指向了 常量区 ; 之后 , 通过指针尝试修改该常量区的字符串..., 字符串在 栈区 和 常量区各有一份 , 可以任意修改栈区的字符串 , 常量区的字符串仅用于赋值操作 ; // 将下面的字符串翻转 char str[] = "sdfsdfsdabc4548411abc

61410

【C++】运算符重载案例 - 字符串类 ③ ( 重载 左移 << 运算符 | 自定义类使用技巧 | 直接访问类的私有指针成员 | 为指针分配指定大小内存并初始化 0 )

的友元函数 friend ostream& operator<<(ostream& out, String& s); } 二、自定义类使用技巧 ---- 1、直接访问类的私有指针成员 在开发中 ,...自定义了一个 class 类 , 其中定义了 指针 类型的 成员变量 ; 一般情况下 , 成员变量 都要 声明为 私有 private 的 ; 如果要 直接是使用 私有的指针变量 , 可以通过 public..., 不包括 '\0' // 内存占用空间大小 = 字符串长度 + 1 int m_len; // 字符串指针, 指向堆内存中的字符串 char* m_p; }; 2、为指针分配指定大小内存并初始化...0 在 有参构造函数 中 , 接收 int 类型的参数 , 该参数表示字符串大小 ; 如果 参数 为 0 , 则创建一个空字符串 , 指针指向的内存空间大小为 1 , 只存放一个 ‘\0’ 字符 ,.../ 拷贝空字符串到 m_p 指向的内存中 strcpy(this->m_p, ""); } else { // 获取传入字符串的长度 // 但是 , 字符串指针 指向的内存空间大小需要

25510
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++奇迹之旅:C++内存管理的机制初篇

    C/C++内存分布 这是C/C++中程序内存区域划分图: 数据段:也叫静态数据段或初始化数据段,用于存储程序中的全局变量和静态变量,这些变量在程序启动时就已经分配好内存空间并初始化。...而pChar3 本身是一个指针变量,存储在栈上,它指向常量区中的字符串。由于字符串字面量是只读的,所以通过 *pChar3 我们只能读取字符串的内容,而不能修改它。...*pChar3 在栈中, pChar3 在代码段(常量区),指针变量 pChar3 存储在栈中,*pChar3 指向一个字符串常量,该字符串常量存储在代码段(常量区)中,代码段(常量区)用于存储程序中的常量数据...(不包括结尾的 '\0' 字符),它在运行时计算字符串的长度,需要遍历整个字符串,对于数组,strlen 只能用于字符数组(字符串),不能用于其他类型的数组,对于指针,strlen 可以计算指针所指向的字符串的长度...,并返回指向该内存块的指针, 分配的内存块内容是未初始化的。

    14010

    C++面试知识总结

    2.14 野指针,未初始化指针和空指针的区别 野指针:指向一个已删除的对象或无意义地址的指针。 原因:指针变量没有被初始化,或者指针p被free或者delete之后,没有置为NULL。  ...空指针:空指针表示“未分配” 或者“尚未指向任何地方” 的指针。 区别:空指针可以确保不指向任何对象或函数; 而未野指针或初始化指针则可能指向任何地方。...在实际编程中不需要了解在我们的系统上空指针到底是一个 0指针还是非0地址,我们只需要了解一个指针是否是空指针就可以了——编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。...类模板的实例化必须由程序员在程序中显式地指定。...对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const。 在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值。

    1.8K41

    进程地址空间管理

    虚拟地址空间初始化 虚拟地址空间就是mm_struct,在task_struct中。作为对象,需要被初始化。...野指针 从操作系统层面理解野指针: 未初始化指针与页表:当一个指针未初始化时,它指向的虚拟地址是随机的。这个随机地址很可能在页表中没有对应的映射项。...因为正常的内存分配(如通过malloc、new等操作)会由操作系统分配一段合法的虚拟地址,并在页表中建立映射。而未初始化的指针所指向的地址没有经过这样的分配过程,所以在页表中找不到对应的物理地址。...)通常被存储在代码段(Text Segment)中。这是因为常量字符串在程序的整个运行过程中不需要修改,将它们放在代码段可以利用代码段的只读特性来保护这些字符串不被意外修改。...这就是在地址转换的时候权限拒绝了对数据的写操作,所以无法修改。 解耦合! 简单回顾一下程序加载进内存的过程: 在虚拟地址空间申请指定大小的空间(调整区域划分)。 加载程序,申请物理空间。

    7310

    Uber Go 编程风格指南

    http.ResponseWriter, r *http.Request) { // ... } 接收器和接口 带有值接收器的方法可以在值和指针上调用,而带有指针接收器的方法只能在指针或可寻址的值上调用...如果必须使用,请确保它是确定性的,并且不依赖于外部状态。 在 main 中退出 仅在 main() 中调用 os.Exit 或 log.Fatal。所有其他函数应返回错误。...避免重复的字符串到字节转换 避免重复将相同的字符串转换为字节切片。转换一次并重用结果。 优先指定容器容量 尽可能指定切片和映射的容量,以避免不必要的分配。...未导出的全局变量前缀为 _ 为避免意外使用,未导出的顶层变量和常量应前缀为 _。 结构体中的嵌入 仅在提供实际好处时才在结构体中嵌入类型。避免嵌入互斥锁。...使用原始字符串字面量避免转义 使用原始字符串字面量以避免字符串中的转义字符。 初始化结构体 使用字段名初始化结构体 初始化结构体时始终使用字段名。

    5600

    第九节(结构、联合typedef)

    结构标签用于定义结构的模板或格式:而结构实例是用结构标签声明的变量。 四:初始化结构 与C语言其他类型的变量一样,在声明结构时可以初始化它。...与所有的指针一样,不能使用未初始化的指针。 如果在声明时没有初始化,可以稍后为其赋值后再使用。 记住,要把变量的地址赋给指针。...字符串中的字符数超出数组指定的大小。...结构中的指针可以指向任意长度的字符串。虽然实际的字符串并未储存在结构中,但是它们仍然是结构的一部分。 警告: 使用未初始化指针,会无意中擦写已使用的内存。 使用指针之前,必须先初始化指针。...可以在generic_tag 类型的结构中把一个字符、一个整数或一个浮点数储存在相同的内存区域。 该区域是一个名为shared的联合,这与程序清单7相同。

    24220

    【C语言】关于指针各项细节以及与其他知识点关联

    野指针与空指针 在使用指针时,错误地访问未初始化或已经释放的内存地址会导致“野指针”问题。而空指针(NULL pointer)则是一个特殊的指针,表示指向的地址为空。...int *ptr; *ptr = 10; // 未初始化的指针可能指向不确定的内存 空指针:通过将指针赋值为NULL,可以表示其不指向任何有效地址。 int *ptr = NULL; 12....未初始化的指针:使用未初始化的指针会导致指针指向未知的内存区域,可能引发未定义行为。解决办法是:初始化所有指针,或者在定义时直接赋值NULL。...,尤其是在内存分配或访问未初始化的内存时。...指针与内联汇编 C语言允许在代码中插入汇编指令,指针在内联汇编中也可以直接与寄存器或内存地址交互,提供对底层硬件的高效访问。

    13010

    Golang深入浅出之-Go语言结构体(struct)入门:定义与使用

    在Go语言的世界中,结构体(struct)作为构建复杂数据类型的基础组件,扮演着至关重要的角色。它允许我们组合多个不同类型的字段,形成一个自定义的数据结构,以更好地模拟现实世界中的实体或概念。...结构体的定义简洁明了,字段间以逗号分隔,类型紧跟字段名。常见问题与避免方法问题1:未初始化的结构体字段默认值Go语言结构体的字段如果没有显式初始化,其默认值取决于字段类型。...对于数值类型,如int、float64等,默认为零值;对于字符串类型,默认为空字符串;对于指针、切片、映射等引用类型,默认为nil。在使用未初始化的结构体时,需注意这些默认值可能不符合预期。.../ 输出 "New York"结构体方法结构体可以拥有关联的方法,通过在接收者参数中指定结构体类型实现:func (p Person) Introduce() string { return fmt.Sprintf...对于切片,可以使用reflect.DeepEqual()函数进行深度比较。结构体指针接收者在定义结构体方法时,接收者可以是结构体值或指针。

    32610

    Go语言开发规范实践指南

    例外:如果有 3 个或更少的字段,则可以在测试表中省略字段名称。...,在这样的传递过程中,实质上传递的底层数据仍然可以是指针。...否则使用 make (如果可以,请尽量指定 map 容量)。 在边界处拷贝 Slices 和 Maps 描述: slices 和 maps 包含了指向底层数据的指针,因此在需要复制它们时要特别注意。...描述: 在尽可能的情况下,在初始化要追加的切片时为make()提供一个容量值,你可以在性能的那一章节中看见使用make可以减少切片在循环追加时对于内存分配的次数(增加执行效率)。...指定Map容量: 在尽可能的情况下,在使用 make() 初始化的时候提供容量信息make(map[T1]T2, hint),向make()提供容量提示会在初始化时尝试调整map的大小,这将减少在将元素添加到

    1.5K20

    memset函数使用方法

    将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。...memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;例:char a[100];memset(a, '/0', sizeof(a));...strcpy就只能拷贝字符串了,它遇到'/0'就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘/0’之前)是否超过...5.补充:一点心得 memset可以方便的清空一个结构类型的变量或数组。...说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。

    1.9K100

    世界上最好的语言——Go

    定义包名在程序代码第一行使用 package 包名 指定包名,使用 import ( alias "p1" ) 方式导入包,其中alias参数是包的别名,不指定别名时,可以省略括号,使用'....自动补齐分号 golang在一些情况下,会在代码中每行末尾自动补齐分号: 1.当输入被断开为标记时,如果行末标记为: 一个标识符 一个整数、浮点数、虚数、字符或字符串文字 关键字break、continue...、fallthrough或return中的一个 运算符和分隔符++、--、)、]或}中的一个 则分号将被自动插入到标记流中非空白行的末尾。...golang中的函数可以一次返回多个数据,这与他可以同时初始化多个变量值的特性相关,当返回数据就一个时,可以省略返回值的括号,如 func re2val() (int,string){ return...( A = iota B = iota ) 最终结果,A变量值为0,B变量值为1 在const表达式中,不指定变量初始值,会自动沿用上一变量的初始值表达式,所以上述代码可以简写为 const

    89841

    C++ Primer Plus 第四章 复合类型 学习笔记

    编译器不会检查下标是否有效,所以要注意下标合法性,避免程序异常问题。 C++使用索引的方括号表示法来指定数组元素。...基于String类库的方法 存储在连续字节中的一系列字符意味着可以将字符串存储在char数组中。其中每个字符都位于自己的数组元素中。...*运算符称为间接值或解除引用运算符,将其应用于指针,得到该地址处存储的值。 7.1 声明和初始化指针 指针的声明必须指定指向的数据的类型。...方法1:对指针应用解除引用或间接值运算符(*)来解除引用。 cout<<*pn; *pc = 's'; 方法2:使用数组表示法。不可以对未初始化为适当地址的指针解除引用。...在cout和多数C++表达式中,char数组名、char指针以及用引号括起来的字符串常量都被解释为字符串第一个字符的地址。 不要使用字符串常量或未被初始化的指针来接收输入。

    1.8K00

    熬夜整理的万字CC++总结(二),值得收藏

    = 0x1122; //给q指向的内存区域拷贝内容 strcpy(q, "2222"); //err } 1.1.2.2 野指针 在使用指针时,要避免野指针的出现: 野指针指向一个已删除的对象或未申请访问受限内存区域的指针...指针变量未初始化 任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。...指针释放后未置空 有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。...可以执行,void*指针只可以储存变量地址,不可以直接操作它指向的对象 由于void是空类型,只保存了指针的值,而丢失了类型信息,我们不知道他指向的数据是什么类型的,只指定这个数据在内存中的起始地址...1.1.2.4 void*数组和指针 同类型指针变量可以相互赋值,数组不行,只能一个一个元素的赋值或拷贝 数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的。

    1.3K20

    《C Primer》笔记(下篇)

    fgets()函数在遇到EOF时将会返回NULL值,可以利用这一机制检查是否已经到达文件结尾,如果未遇到EOF则之前返回传给它的地址。...结构中的字符数组和字符指针 截至目前,我们都使用字符数组来储存字符串,我们也可以考虑用指向char型的指针来代替字符数组。...即使在自动检查标准库的系统中,也会有不常用的函数库,必须通过编译时选项显式指定这些库。 头文件提供函数声明或原型,库选项告诉系统到哪里查找函数代码。...1.建立抽象 对于链表而言,首先它应该能存储一系列的项,并且这些个项能以某种方式排列,其次它应该提供某些操作,如在链表中添加新项等: 初始化一个空链表 在链表末尾添加一个新项 确定链表是否为空 确定链表是否已满...: 初始化数为空 确定树是否为空 确定树是否已满 确定树中的项数 在树中添加一个项 在树中删除一个项

    2.2K40

    18(终端IO)和19(伪终端)

    输入字符不组成行 1 获得和设置终端属性 使用函数tcgetattr和tcsetattr可以获得或设置termios结构。...这样也可以检测和修改各种终端选择标志和特殊字符,以使终端按照我们所希望的方式进行操作 #include int tcgetattr(int filedes, struct termios...Opt可以指定下列常量中的某一个: TCSANOW 更改立即发生 TCSADRAIN 发送了所有输出后更改才发生。可以用来更改输出参数 TCSAFLUSH 发送了所有输出后更改才发生。...在更改发生时未读的所有输入数据都被删除 2 打开伪终端设备 #include #include int posix_openpt(int oflag);...类似,如果slave_winsize指针非空的时候,就用其引用的结构来初始化slave的窗口大小,如果这个指针为空,那么一般会将窗口大小的结构初始化为0。

    1.1K30

    《UNIX环境高级编程》第七章进程环境

    BSS段(未初始化数据段):未初始化的全局变量和静态变量 堆区:用来动态分配的内存,malloc出来的东西(由低向高扩散) 栈区:自动变量以及每次函数调用时所需保存的信息保存在此段中。...还有一个优点:可以用库函数的新版本代替老版本而不需要对使用该库的程序重新连接编辑。(这么一看有点像动态库) 在不同的系统中,程序可能使用不同的方法说明是否要使用共享库。...次存储区中的初始值不确定 2)calloc:为指定数量指定长度的对象分配存储空间。该空间中的每一位(bit)都初始化为0 3)realloc:增加或减少以前分配区长度。...接着将原来的环境表分配到新的分配区,并将指向新name=value字符串的指针存放在改指针表的末尾,然后又存放一个null指针在最后。...(int resource, const struct rlimit *rlim); 在更改资源限制时,须遵循下列三条规则: 1)任何一个进程都可以将一个软限制值更改为小于或等于其硬限制值 2)任何一个进程都可降低其硬限制值

    51010

    第4章 | 移动

    图 4-9:Rust 如何表示内存中的字符串向量 但要记住,在 Rust 中,大多数类型的赋值会将值从源转移给目标,而源会回到未初始化状态。因此在初始化 t 之后,程序的内存如图 4-10 所示。...向量的元素保持原样,字符串也没有任何变化。每个值依然只有一个拥有者,尽管其中一个已然易手。整个过程中没有需要调整的引用计数,不过编译器现在会认为 s 是未初始化状态。...在每次迭代中,循环都会将另一个元素转移给变量 s。由于 s 现在拥有字符串,因此可以在打印之前在循环体中修改它。在循环的过程中,向量本身对代码不再可见,因此也就无法观察到它正处在某种部分清空的状态。...4 4因此不用担心中途修改向量本身之类的问题。——译者注 如果需要从拥有者中移出一个编译器无法跟踪的值,那么可以考虑将拥有者的类型更改为能动态跟踪自己是否有值的类型。...这是因为类型是否为 Copy 对于在代码中使用它的方式有着重大影响:Copy 类型更灵活,因为赋值和相关操作不会把原始值变成未初始化状态。

    7710

    《Go语言入门经典》7~9章读书笔记

    第7章 使用结构体和指针 7.1 结构体是什么 结构体是一系列具有指定数据类型的数据字段,它能够让您通过单个变量引用一系列相关的值。通过使用结构体,可在单个变量中存储众多类型不同的数据字段。...在main函数中,使用简短变量赋值声明并初始化了变量m,给数据字段指定的值为相应的数据类型。 使用点表示法访问数据字段并将其打印到控制台。 7.2 创建结构体 声明结构体后,就可通过多种方式创建它。...) Cub() int{ return m.Num * m.Num * m.Num } 8.3 使用方法和指针 方法是一个接受被称为接收者的特殊参数的函数,接收者可以是指针,也可以是值。...var str = "this is a demo" 除换行符和未转义的双引号外,解释型字符串字面量可包含其他任何字符。对于前面有反斜杠(\)的字符,将像它们出现在rune字面量中那样进行解读。...1.将字符串转换为小写 ToLower() strings.ToLower("YX IS YX"); 2.在字符串中查找子串 Index() 处理字符串时,另一个常见的任务是在字符串中查找子串。

    44820

    C语言进阶(十四) - 文件管理

    通过C语言的文件相关的知识,我们将会有办法把程序运行产生的数据写入我们指定的磁盘文件中。...磁盘(外存)中的文件存放的信息是持久化的,不会像运行在内存中的程序那样,在程序运行结束或突然计算机断电等情况导致数据消失。 ---- 1....这些设备输入输出的格式很可能各自都有差异,我们在写程序时并不会关注这些差异,在这些输入输出设备之前,数据先要要经过流,流中的数据系统经过一系列操作就可以实现把数据采用正确的格式输入到内存或输出到设备。...num-1个字符并将其作为字符串(自动在字符末尾补加**'\0'**)储存到str中。....); 头文件为 功能:把指针str**指向的字符串的内容转换为格式化的数据。**从字符串读取数据,并根据参数格式将其存储到附加参数指定的位置。 返回类型为int。

    99710
    领券