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

指向字符串指针赋值就出错

现有一个指向字符串指针, char *test ="123123123"; 如果执行下面这句话就会出错 *test=“321321”; 这是因为 test 这个指针指向是123123123这个储存于常量区字符串...这个区域数据是不可改写,所以运行*test=“321321”;这句话会出错。 数据存在于哪里通常可以用4个区来表达,也就是常说内存四区。...通常说内存四区指就是上图中堆区、栈区、全局区和代码区这四个部分,全局区又可以分为全局变量区和常量区。 栈区包括局部变量、函数入参,返回值等。堆区是由程序员自行分配内存。...全局区用于存放全局变量、静态变量和常量,里面还有一个常量区,字符串常量和其他常量存放在此。该区域是在程序结束后由操作系统释放。const定义全局变量存放在常量区(这个注意一下)。...通过以上可以看出,上图中红色框内是不可以更改,开头那个字符串是存储在常量区,是不可以更改。所以开头那个程序运行就会出错

49730

8.7 动态内存分配与指向指针变量

01 什么是内存动态分配 1、全局变量是分配在内存中静态存储区,非静态局部变量(包括形参)是分配在内存中动态存储区,这个存储区是一个“栈”区域。...2、C语言允许建立内存动态分配区域,以存放一些临时用数据,这些数据不必在程序声明部分定义,也不必等到函数结束才释放,而是需要随时开辟,不需要随时释放。...形参size类型定为无符号整型。此函数是一个指针型函数,返回指针指向该分配域开头位置。...3、free函数 函数原型:void free(void *p); 其作用是释放指针变量p所指向动态空间,使这部分空间能重新被其他变量使用。...03 void指针类型 1、指向void类型应该理解为指向空类型或者不指向确定类型数据。 2、把void指针赋值给不同基类型指针变量,编译系统会自动进行转换,不必用户自己进行强制转换。

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

7.7 动态内存分配与指向指针变量

一、什么是内存动态分配 全局变量是分配在内存中静态存储区,非静态局部变量是分配在内存中动态存储区,这个存储区称为“栈”。...C语言中允许建立内存动态分配区域,以存放一些临时用数据,这些数据不必在程序声明部分定义,也不必等到函数结束才释放,而是需要随时开辟,不需要随时释放。...n个长度为size连续空间,这个空间一般比较大 (3)free函数 函数原型 void free(void *p); 作用:释放指针变量p所指向动态空间,使这部分空间能重新被其他变量使用 (4)realloc...函数 函数原型 void *realloc(void *p,unsigned int size); 作用:重新分配动态空间大小 三、void指针类型 C99允许使用基类型为void指针类型 注意:不要把指向...void类型理解为指向任何类型,而应理解为指向空类型或不确定向类型

6673329

8.7 C语言动态内存分配与指向指针变量

01什么是内存动态分配 1、全局变量是分配在内存中静态存储区,非静态局部变量(包括形参)是分配在内存中动态存储区,这个存储区是一个“栈”区域。...2、C语言允许建立内存动态分配区域,以存放一些临时用数据,这些数据不必在程序声明部分定义,也不必等到函数结束才释放,而是需要随时开辟,不需要随时释放。...形参size类型定为无符号整型。此函数是一个指针型函数,返回指针指向该分配域开头位置。...3、free函数 函数原型:void free(void *p); 其作用是释放指针变量p所指向动态空间,使这部分空间能重新被其他变量使用。...03void指针类型 1、指向void类型应该理解为指向空类型或者不指向确定类型数据。 2、把void指针赋值给不同基类型指针变量,编译系统会自动进行转换,不必用户自己进行强制转换。

1.2K2725

C++使用new来初始化指向指针

C++指针初始化问题 c++中指针是一个很经典用法,但是也是最容易出错,比如定义了一个指针,必须对其进行初始化,不然这个指针指向是一个未知内存地址,后续对其操作时候,会报错。...c++指针初始化一般方法 1.将一个已经在内存中存在变量地址传递给定义指针 这个指针指向这个变量内存地址(相同数据类型),完成初始化。...delete释放其实只是释放了申请这块内存空间,但是指针并没有没撤销,指针还是指向这块地址,但是不可用(靠人品吃饭有可能可以用),是非法。...所以用delete释放掉一块堆内存,应该自己手动将指针设置为NULL。...自己遇见问题 我在使用结构体指针时候,忘记将结构体指针初始化,导致后面访问结构体成员变量时候出现错误(那种编译没错,执行出错问题),后来将指针使用new初始化解决,还有一点就是,全局变量名称与局部变量名称不要一样

31120

一文读懂C语言与C++动态内存

C、C++程序编译内存分配 1.从静态存储区域分配 内存在程序编译就已经分配好,这块内存在程序整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static变量等。...一个C、C++程序编译内存分为5大存储区:堆区、栈区、全局区、文字常量区、程序代码区,如下表所示。 ?...C、C++程序编译内存分配情况 实例: int a=0; //全局初始化a char *p1; //全局区未初始化p1 static char b; //全局区未初始化静态变量...代码二:其中p[]数组是函数A中局部变量,函数返回后,p就被释放掉,str便指向了一段无用内存区域。 代码三:没有判断动态内存申请是否成功而直接使用,没有释放动态申请内存,造成内存泄漏。...注意:申请动态内存一定要先判断是否申请成功,失败要进行失败处理;动态内存使用后要及时释放,不要造成内存泄漏;释放后将原先指向动态内存指针置空,以免生成“野指针”。

86010

【编程基础】C语言内存使用常见问题

二、 栈区内存 1 内存未初始化初始化栈区变量其内容为随机值。直接使用这些变量会导致不可预料后果,且难以排查。 指针初始化(野指针)或未有效初始化(如空指针)非常危险,尤以野指针为甚。...【对策】 在定义变量就对其进行初始化。某些编译器会对未初始化发出警告信息,便于定位和修改。 2 堆栈溢出 每个线程堆栈空间有限,稍不注意就会引起堆栈溢出错误。注意,此处“堆栈”实指栈区。...因为指针做为函数参数,函数内部只能改变指针指向地址内容,并不能改变指针指向。...【对策】 不要用return语句返回指向栈内变量指针,可改为返回指向静态变量或动态内存指针。但两者都存在重入性问题,而且后者还存在内存泄露危险。...3 内存释放失败 内存释放失败主要原因有: 1) 释放未指向动态内存指针; 2) 指向动态内存指针在释放前被修改; 3) 内存越界,导致malloc等分配函数所维护管理信息被破坏; 4) 内存重复释放

3.2K60

【C语言】内存动态分配与释放

全局(静态)区:未初始化全局/静态区(.bass)和已初始化全局/静态区(.data)....,该空间内所有位都会初始化为0 返回值 若分配成功,则返回一个指向已分配空间开头指针;若分配失败,则返回空指针 如果想了解更多关于calloc()函数相关信息,如calloc()函数参数设定...功能 释放ptr指向空间,让这部分空间能继续用于之后动态分配.当ptr为空指针,不执行任何操作.除此之外,当实际参数与之前通过malloc(),calloc(),realloc()返回指针不一致...,或者ptr指向空间已经通过调用free()或realloc()被释放,则作未定义处理....而当我们不对malloc()函数开辟结果做检查的话,就很可能导致以下这种情况: 因此,为防止在使用动态内存开辟函数造成对空指针解引用操作,我们在每次使用完动态内存开辟函数后,都应先检查一下它返回值

10810

【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

) : 存放代码内容, 编译就确定了, 只能读, 不能写 ; 2.数据段 ( .data section ) : 存放 已经初始化 静态局部变量 和 全局变量, 编译阶段确定, 可读写 ; 3.BSS...段 ( .bss section ) : 存放 没有初始化 静态局部变量 和 全局变量, 可读写 , 程序开始执行时候 初始化为 0 ; ---- ( 2 ) 分析程序文件内存布局 分析简单程序...全局 int 类型变量, 并且进行了初始化, 存放在 数据段 int global_int = 666; //2....3.bss 段 : 从程序文件映射到内存空间中 , 存放 没有初始化 静态局部变量 和 全局变量, 其值自动初始化为 0 ; 4.data 段 : 从程序文件映射到内存空间中 , 存放 已经初始化..., 指针指向其它地址都是不合法 ; 3.空指针 与 野指针 : 空指针不容易出错, 因为可以判断出来, 其指针地址为 0 ; 野指针指针地址 不为 0 , 但是其指向内存不可用 ; 4.野指针不可判定

1.6K40

C语言进阶(十二) - 动态内存管理

变长数组长度确定之后在生命周期内长度是固定。 变长数组定义不能初始化。 变长数组必须在程序块范围内定义,不能在文件范围内定义变长数组。...如果开辟成功,返回指向这块空间指针; 如果开辟失败,返回空指针(NULL),应该检查malloc返回值以防止返回指针; 函数参数是size,要申请字节个数,类型size_t,无符号整型。...一次动态开辟空间大小是确定,对动态开辟空间进行访问操作不注意对边界控制,可能会导致越界访问,成为野指针,导致程序出错。...但在接下来对这块空间使用中,可能会使指针ptr指向这块内存空间其它非起始地址处,并且使用者没有注意到这一点就直接对ptr指向动态开辟内存空间一部分进行了释放,导致出错。...这时指针储存内容是什么就不好说了,不一定还是第二次动态开辟空间起始地址了。此时释放指针成员指向内存就是非法访问。

43110

分享丨CC++内存管理详解--堆、栈

全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前C语言中,全局变量又分为初始化和未初始化,在C++里面没有这个区分了,他们共同占用同一块内存区。...数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组内容可以改变。 指针可以随时指向任意类型内存块,它特征是“可变”,所以我们常用指针来操作动态内存。...“野指针成因主要有三种: (1). 指针变量没有被初始化。任何指针变量刚被创建不会自动成为NULL指针,它缺省值是随机,它会乱指一气。...所以,指针变量在创建同时应当被初始化,要么将指针设置为NULL,要么让它指向合法内存。...} p->Func(); // p是“野指针” } 函数Test在执行语句p->Func(),对象a已经消失,而p是指向a,所以p就成了“野指针”。

97521

golang内存模型与new()与make()

<--stack|env|高地址| 其中: (1)text存储程序主体,即机器指令. (2)data,bss存储全局变量, data存储初始化全局变量. bss存储未初始化全局变量. bss全称Block...types: variable point to reference toward heap, 即变量在函数调用栈中内容是reference, 指向heap中某块内存....对于reference types是复制引用. new()操作: 在函数调用栈中分配内存, 内容是目标类型零值, 返回值是目标类型指针. make()操作: 先在动态内存堆分配内存, 内容也是目标类型零值...但是, new()也可用于refrences types, 只是返回值是nil指针. make()不可用于value types, 编译会出错: make(xxx) cannot make type...: 多个reference指向heap中大内存,导致不能及时释放造成内存泄露危险.

59160

C语言中如何进行内存管理

二、内存分配 C语言中有三种内存分配方式: 静态内存分配 栈内存分配 动态内存分配 静态内存分配 静态内存分配:静态内存分配是在程序编译进行,它将内存分配给全局变量和静态变量。...如果内存分配成功,ptr 将指向分配内存块,否则输出错误信息并退出程序。然后,可以通过 ptr 访问和修改分配内存。最后,使用 free() 函数释放分配内存块。...如果内存分配成功,ptr 将指向分配内存块,否则输出错误信息并退出程序。然后,可以通过 ptr 访问和修改分配内存。最后,使用 free() 函数释放分配内存块。...在使用动态内存分配,程序员需要在不再使用内存空间手动调用 free() 函数来释放内存。...,并返回指向该内存空间指针

13610

golang内存模型与new()与make()

<--stack|env|高地址| 其中: (1)text存储程序主体,即机器指令. (2)data,bss存储全局变量, data存储初始化全局变量. bss存储未初始化全局变量. bss全称Block...types: variable point to reference toward heap, 即变量在函数调用栈中内容是reference, 指向heap中某块内存....对于reference types是复制引用. new()操作: 在函数调用栈中分配内存, 内容是目标类型零值, 返回值是目标类型指针. make()操作: 先在动态内存堆分配内存, 内容也是目标类型零值...但是, new()也可用于refrences types, 只是返回值是nil指针. make()不可用于value types, 编译会出错: make(xxx) cannot make type...: 多个reference指向heap中大内存,导致不能及时释放造成内存泄露危险.

7K70

golang内存模型与new()与make()

<--stack|env|高地址| 其中: (1)text存储程序主体,即机器指令. (2)data,bss存储全局变量, data存储初始化全局变量. bss存储未初始化全局变量. bss全称Block...types: variable point to reference toward heap, 即变量在函数调用栈中内容是reference, 指向heap中某块内存....对于reference types是复制引用. new()操作: 在函数调用栈中分配内存, 内容是目标类型零值, 返回值是目标类型指针. make()操作: 先在动态内存堆分配内存, 内容也是目标类型零值...但是, new()也可用于refrences types, 只是返回值是nil指针. make()不可用于value types, 编译会出错: make(xxx) cannot make type...: 多个reference指向heap中大内存,导致不能及时释放造成内存泄露危险.

72250

C语言内存管理

(2)函数return语句写错了,注意不要返回指向“栈内存”指针”或者“引用”,因为该内存在函数体结束被自动销毁。...由于addr函数中变量k在函数返回后就已经不存在了,但是在全局变量p中却保存了它地址。...在下一个函数port中,试图通过全局指针p访问一个不存在变量,而这个指针实际指向却是另一个临时变量i,这就导致了死循环发生。...防止使用指针值为NULL内存。 【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化内存作为右值使用。 【规则3】避免数组或指针下标越界,特别要当心发生“多1”或者“少1”操作。...【规则4】动态内存申请与释放必须配对,防止内存泄漏。 【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。 更多案例可以go公众号:C语言入门到精通

1.6K2319

C与C++内存管理避坑指南

(2)函数return语句写错了,注意不要返回指向“栈内存”指针”或者“引用”,因为该内存在函数体结束被自动销毁。...由于addr函数中变量k在函数返回后就已经不存在了,但是在全局变量p中却保存了它地址。...在下一个函数port中,试图通过全局指针p访问一个不存在变量,而这个指针实际指向却是另一个临时变量i,这就导致了死循环发生。...防止使用指针值为NULL内存。 【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化内存作为右值使用。 【规则3】避免数组或指针下标越界,特别要当心发生“多1”或者“少1”操作。...【规则4】动态内存申请与释放必须配对,防止内存泄漏。 【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。

85220

【C】动态内存管理 malloc calloc relloc free 函数详解

,并返回指向这块空间指针。...如果开辟成功,则返回一个指向开辟好空间指针。 如果开辟失败,则返回一个NULL指针,因此malloc返回值一定要做检查。...如果我们对申请内存空间内容要求初始化,那么可以很方便使用calloc函数来完成任务。 ---- 2.3 realloc realloc函数出现让动态内存管理更加灵活。...注意:printf(str);这种写法是正确。 主要错误如下: 1.改变形参p,str依然是NULL,strcpy无法将”hello world”拷贝到空指针指向地址,所以会访问出错。...堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束可能由OS回收 。分 配方式类似于链表。 数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。

26340

C++之指针使用

指针和数组对比   C++/C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价。数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。...数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组内容可以改变。指针可以随时指向任意类型内存块,它特征是“可变”,所以我们常用指针来操作动态内存。...人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险,if语句对它不起作用。   “野指针成因主要有三种:   (1)指针变量没有被初始化。...因此C++语言需要一个能完成动态内存分配和初始化工作运算符new,以及一个能完成清理与释放内存工作运算符delete。注意new/delete不是库函数。...五 内存耗尽怎么办   如果在申请动态内存找不到足够大内存块,malloc和new将返回NULL指针,宣告内存申请失败。通常有三种方式处理“内存耗尽”问题。

62710

C语言动态内存分配函数malloc(),calloc(),realloc()用法对比分析

int n; scanf("%d", &n); int a[n]; 这样编写会在编译出错 , 编译器会提醒[ ]中应为常量表达式 , 在C中定义数组可以用有以下几种 ,例: #define N 10...) malloc()函数会向堆中申请一片连续可用内存空间 若申请成功则返回指向这片内存空间指针 ,若失败 ,则会返回NULL, 所以我们在用malloc()函数开辟动态内存之后, 一定要判断函数返回值是否为...如果ptr没有指向使用动态内存分配函数分配内存空间,则会导致未定义行为。 如果ptr是空指针,则该函数不执行任何操作。...若申请成功 ,,返回指向这片内存空间指针 ,若失败 ,则会返回NULL, 所以我们在用calloc()函数开辟动态内存之后, 一定要判断函数返回值是否为NULL....若调整成功, 返回值为调整大小后内存起始位置(也就是指向调整后内存指针), 若失败(当没有内存可以分配, 一般不会出现), 则返回NULL, 所以还是要对返回值判空。

1.3K10
领券