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

C指针错误->表达式必须是可修改的左值

C指针错误是指在C语言中,出现了表达式必须是可修改的左值的错误。这个错误通常发生在对指针进行操作时,尝试修改一个不可修改的值,或者将一个不可修改的值赋给一个指针。

指针是C语言中一种特殊的变量类型,它存储了一个内存地址,可以用来访问该地址上存储的数据。在C语言中,指针可以被用来修改所指向的内存地址上的值。

然而,有些情况下,表达式必须是可修改的左值,这意味着只有可修改的变量才能被赋值或修改。如果尝试将一个不可修改的值赋给一个指针,或者尝试修改一个不可修改的值,就会导致C指针错误。

解决C指针错误的方法通常是检查代码中的指针操作,确保操作的对象是可修改的左值。如果需要修改的值是一个常量,可以考虑使用可修改的变量来代替。

以下是一些常见的导致C指针错误的情况:

  1. 将常量赋给指针:
代码语言:txt
复制
const int num = 10;
int *ptr = # // 错误,尝试将常量赋给指针

解决方法:使用可修改的变量来代替常量。

  1. 尝试修改常量的值:
代码语言:txt
复制
const int num = 10;
*num = 20; // 错误,尝试修改常量的值

解决方法:使用可修改的变量来代替常量。

  1. 尝试修改指针指向的常量值:
代码语言:txt
复制
const int num = 10;
int *ptr = #
*ptr = 20; // 错误,尝试修改指针指向的常量值

解决方法:将指针指向可修改的变量。

总结起来,C指针错误是由于对不可修改的值进行修改或赋值操作导致的。要解决这个错误,需要确保操作的对象是可修改的左值,即可被赋值或修改的变量。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )

文章目录 一、直接修改 和 间接修改 指针变量 的值 二、在函数中 间接修改 指针变量 的值 三、在函数中 间接修改 外部变量 的原理 一、直接修改 和 间接修改 指针变量 的值 ---- 直接修改 指针变量...在 函数中 , 使用 * 符号 , 修改 二级指针 指向的 一级指针 的变量值 ; 注意 : 如果要 修改 一级指针 的值 , 必须 传入 指向 一级指针 的 二级指针 变量 才可以 , 传入一级指针变量...函数外部 的变量 , 必须传入 指向该变量的 指针才可以 ; 代码示例 : #include #include /* * 函数中简介修改指针值 */ void...三、在函数中 间接修改 外部变量 的原理 ---- 如果要 修改 一级指针 的值 , 必须 传入 指向 一级指针 的 二级指针 变量 才可以 , 传入一级指针变量 , 不能修改一级指针变量值 ; 这是因为...如果传入 一级指针 变量 , 这个传入的 一级指针 变量 , 其 生命周期 到函数结尾就结束了 , 跟函 数外部的 一级指针 变量 没有任何关系 ; 如果 要修改 函数外部 的变量 , 必须传入 指向该变量的

21.4K11

C语言函数传递了指针,值没有被修改的原因及解决方法

C语言函数指针参数值为什么不变C语言函数中传递了指针作为参数,确切来说是传递了指向变量的内存地址作为参数,可经过函数内的修改之后,该指针指向的变量的值为什么不会被修改?...这个跟运算符的优先级也没有关系,像上面这样的*x++的表达式中,并不会被优先计算x++,即不会先进行内存地址的自增运算。下面的实例中将探讨这一点。...实例代码该实例输出了三个变量的内存地址,前两个是一样的,即通过*x++的运算,变量指向的内存地址并没有发生改变,但是如果是通过指针的自增运算,比如z++,则内存地址会发生改变。...&y); test(&y); printf("%x\n",&y); int *z = &y; z++; printf("%x\n",z);}//编译运行之后得到输出(不同的平台和编译器可能得到不一样的输出...):61fe1461fe1461fe18解决方法将x++修改为:x = *x + 1;原文:C语言函数传递了指针,值为什么没有被修改免责声明:内容仅供参考,不保证正确性!

42721
  • C++ 中 const 和 constexpr关键字解析:常量、函数和指针

    很多的全局变量都是通过常量来进行修饰,需要注意的是,使用const关键字修饰的变量需要立刻初始化 // 修饰局部变量,全局变量,成员变量 const int a = 2; // 错误,表达式必须是可修改的左值...num) { // 错误,表达式必须是可修改的左值,意思就是参数num是个常量,无法修改 num = 3; } 修饰指针 虽然指针也是一种变量,不过当const与指针出现在一起的时候...表达式必须是可修改的左值 *p = 3; // 正确 a = 4; // 4 cout << *p << endl; // 同样地,有人习惯这种写法,作用是一样的,看个人喜好即可 int const...*p2 = &a; // 第二种情况:常量指针 int a = 2; // const作用:使指针p无法指向其他变量 int* const p = &a; int b = 3; // 错误,表达式必须是可修改的左值...{ public: void test() const { // 错误,表达式必须是可修改的左值,因为member是成员变量,而test函数被const修饰过后无法修改成员变量

    98420

    《C++Primer》第四章 表达式

    左值和右值 这两个名词原本是从C继承过来的,主要是为了帮助记忆,左值可以位于赋值表达式左侧,而右值不行。 C++的表达式要不然就是右值r-value,要不然就是左值l-value。...但是在C++语言中,两者的区别没有那么简单: 左值表达式的求值结果是一个对象或者一个函数,但是以常量对象为代表的某些左值却不能作为赋值语句的左侧运算对象 虽然某些表达式的求值结果是对象,但是它们实际上是右值而不是左值...isspace(s[index]) 赋值运算符 赋值运算符的左侧运算对象必须是一个可修改的左值(复制一下,左值指的是对象,可修改的左值意味着能修改对象的值)。...例如const int ci = i;是一个初始化语句而非赋值语句,因为该左值是常量不可修改。...除非必须,否则不用递增递减运算符的后置版本:前置版本的递增运算将值加1之后直接返回该运算对象,但是后置版本需要将原始值存储下来以便于返回这个未修改的内容,如果我们不需要修改前的值的话就是一种性能上的浪费

    86510

    左值和右值、左值引用与右值引用、移动语句(2)「建议收藏」

    左值不一定允许修改它指定的对象。例如,const对象是无法修改的左值。术语可修改的左值用于强调左值允许指定的对象被改变以及被检查。...左值并不一定出现在表达式的左边: 以下对象类型是左值,但不是可修改的左值: 数组类型 不完整的类型 const限定类型 结构或联合类型,其成员之一被限定为const类型 因为这些左值不可修改,所以它们不能出现在赋值语句的左侧...它可以是函数的名称或取消引用函数指针的结果。 C语言还区分它对函数指针和对象指针的处理。 另一方面,在C ++中,返回引用的函数调用是左值。否则,函数调用是rvalue表达式。...= += -= *= %= >= &= ^= |= 左操作数必须是左值。 例如,所有赋值运算符都会计算其右操作数并将该值赋给其左操作数。 左操作数必须是可修改的左值或对可修改对象的引用。...地址运算符(&)需要左值作为操作数,而增量(++)和减量( – )运算符需要可修改的左值作为操作数。 以下示例显示表达式及其对应的左值。

    2.6K20

    c++从入门到进阶--引用与常量

    指针 指针的值初始化后不能改变指向固定的单元(只能指一次) *poi=99;//const限定的是poi的值;可以对指向内容修改,但不可以对指针指向对象修改。...四.引用 左值与右值 区别 左值 右值 赋值表达式 出现在赋值号左边 在赋值号右边的 地址与名字 可以取地址的有名字 不能取地址的没有名字 生成的表达式 返回左值引用的函数 赋值 下标 解引用和前缀自增自减运算符...左值引用 (定义 类型 &引用名=目标变量名) int a=100; int &b=a;/*&是标识符(引用必须被初始化并且初始化完成之后引用将会和初始值对象一直绑定在一起)。...*/ 右值引用(必须要绑定到右值的引用)定义 类型 &&右值引用变量=右值表达式; int &&a=10;//正确 int &&b=10*5;//正确10*5是右值 int &&c=a;//a的类型是int...返回类型和return语句 return 语句形式 return; return表达式; 非void函数必须返回一个与声明类型匹配的值否则会引起编译错误。

    79520

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

    文章目录 一、报错记录 二、修改方案 一、报错记录 ---- 执行下面的代码 , 报错如下 : 执行的错误代码 : #include #include #include...while (p_start < p_end) { // 交换收尾字符 // 记录 p_start 指针指向的首部字符 char c = *p_start...char *str = "sdfsdfsdabc4548411abc"; 字符串导致 , 该字符串存储在 全局区 的 常量区 ; char *str 指针指向了 常量区 ; 之后 , 通过指针尝试修改该常量区的字符串..., 才有了上述报错 ; // 交换收尾字符 // 记录 p_start 指针指向的首部字符 char c = *p_start; //...将尾部字符赋值给首部字符 *p_start = *p_end; // 将首部字符赋值给尾部字符 *p_end = c; 修改方案 : 将字符串定义为如下样式

    61410

    【C++】C++ 引用详解 ③ ( 函数返回值不能是 “ 局部变量 “ 的引用或指针 | 函数内的 “ 局部变量 “ 的引用或指针做函数返回值无意义 )

    一、函数返回值不能是 " 局部变量 " 的引用或指针 1、引用通常做右值 之前使用 引用 时 , 都是作为 右值 使用 , 引用只在 声明 的 同时 进行初始化时 , 才作为左值 , // 定义变量 a...int 为 0 就是成功 , int 为其它数值 , 就是错误码 ; 3、函数内的 " 局部变量 " 的引用或指针做函数返回值无意义 如果 想要 使用 引用 或 指针 作 函数的计算结果 , 一般都是将..., 也就是 修改 地址 / 引用 指向的 内存中的数据 , 该操作可以修改 外部 main 函数中的变量值 ; 如果 想要 在 函数 中 , 返回一个 地址 / 引用 作为返回值 , 这个 地址 /..., 返回 局部变量 的 地址 / 引用 是无意义的 , 一般 函数 只 返回一个 int 值 , 表示 该函数 是否执行成功 , 如果执行失败 , 返回错误码 ( 在哪一步执行失败 ) ; ----..., 该 指针 是 局部变量 的指针 ; 上述两个函数是无意义的 , 获取到 函数 返回的 " 局部变量 " 的 引用 或 指针 , 然后获取地址 , 发现获取的都是随机值 , 都是无意义的值 ; num21

    60420

    【C++】C 语言 和 C++ 语言中 const 关键字分析 ( const 关键字左数右指原则 | C 语言中常量的原理和缺陷 | C++ 语言中常量原理 - 符号表存储常量 )

    , 如果参数中 const 在 * 左边 , const Student *pS , 根据 左数右指原则 , 指针指向的数据是常量 , 不能被修改 ; 下面是错误示范 : // 左数右指 , const..., 就会在编译时报错 : 表达式必须是可修改的左值 函数接收上述结构体类型变量作为参数 , 如果参数中 const 在 * 右边 , Student* const pS , 根据 左数右指原则 , 指针本身是常量..., 指针指向不能被修改 ; 下面是错误示范 : // 左数右指 , const 在指针右边 , 指针本身的指向不能被修改 int fun2(Student* const pS) { pS =...NULL; return 0; } 如果强行修改指针指向 , 就会在编译时报错 : 表达式必须是可修改的左值 上述完整代码示例 : // 导入标准 io 流头文件 // 其中定义了 std 命名空间...> 3、代码示例 - C 语言中使用常量地址修改常量值 如果使用 指针 变量 , 接收 常量 a 的地址 , 然后通过该指针修改 指针指向的 内存空间的值 , 然后再打印 常量 a 的值 , 发现 常量

    60220

    c++基础之表达式

    这次接着更新《c++ primer》 这本书的读书笔记,上一篇博文更新到了书中的第三章,本次将记录书中的第四章——表达式 左值与右值 在理解表达式之前需要先理解c++中左值和右值的概念。...c++ 的表达式要么是右值,要么是左值,这两个名词是从c语言中继承过来的,在c语言中,左值指的是可以位于赋值语句左侧的表达式,右值则不能。在c++中二者的区别就相对复杂一些了。...在c++要区分左值和右值,可以采取一个原则:一般来说当一个对象被用作左值时,用的是对象的地址,也就是在内存中的位置,而右值可以采取排他性原则,只要不是左值的都是右值。...if(1 == val) 赋值运算符 赋值运算符一般作用与初始化给对象赋值或者在后续修改对象的值,但是需要注意区分二者的不同,这点在初始化或者给类对象赋初始值的时候尤其重要 赋值运算符的左侧必须是一个可修改的左值...int i, j; i = j = 10; const k = 10; //这里是初始化,不是赋值 k = i; //错误,左侧需要可以修改的左值 新的c++ 标准中允许使用初始化列表来给对象进行赋值

    81410

    【C++进阶】C++11的认识与学习

    在C++98中,new 出来的一个int指针可以直接初始化,但是当有多个对象时,就只能用循环初始化,C++11的列表初始化就解决了这个问题,可以用{},给多个对象初始化。...使用方法:decltype() 变量 nullptr C++中 NULL 直接被定义成了0 ,没有了指针属性,为了补上这个漏洞,定义 nullptr 为空指针  三.右值引用和移动语义 什么是左值?...左值:可以取地址,一般情况下,值可以被修改,左值可以出现在赋值符号的左右边;例如变量名,解引用的指针 右值:不可以取地址,右值只能出现在赋值符号的右边;例如字面常量,表达式,函数返回值 是否能取地址是左值和右值最大的区别...过的左值(注意,a仍然是左值,只不过是move返回的是一个右值) //注意 rr1 rr2 的属性仍为左值 return 0; } 右值引用的应用 场景1 自定义类型中深拷贝的类中,必须传值返回的场景...在块作用域以外的lambda函数捕捉列表必须为空 lambda表达式之间不能相互赋值 其实,lambda表达式的底层是仿函数,即使两个lambda表达式看起来是一样的,但它们在底层仍然不同,不属于同一个类型

    16510

    【笔记】《C++Primer》—— 第4章

    首先表达式的值(value)通常来说分为两类,左值(lvalue)和右值(rvalue)。...简单的分辨方法就是:可以利用&取到地址的值就是左值,也就是我们修改这个值是会连接到指定的栈上的内存的值,我们平时用的变量就是左值;其余的不是左值的值都是右值,例如很多的直接运算结果(1+1)之类的临时值...当这个内容是表达式时,如果表达式是左值,返回的是这个左值的引用,例子如一个int* p指针,decltype(*p)的结果会是int&;如果表达式是右值返回的是普通的右值类型。...4.4 赋值运算符 赋值运算符的左边必须是一个可修改的左值(不是const),且右边必须和左边类型相同或者可以被转换。 C11支持使用花括号来初始化对象(类似数组的显式初始化),称为列表初始化。...数组会在大多数表达式中转换为指针除了sizeof,decltype之类的运算符 非常量类型的指针可以转换为常量指针,但是不能反反向隐式转换 cin的返回值是读入成功还是失败的bool值 在强制类型转换中

    62440

    深入理解C++11右值引用与移动语义:高效编程的基石

    在C++中,左值(Lvalue)和右值(Rvalue)是表达式类型的重要概念。它们决定了表达式的“值类别”,即表达式的结果可以用于什么类型的操作,比如赋值、地址取用等。 1....左值(Lvalue) 左值(Lvalue,Locator value)是一个可以取地址的表达式,表示一个持久的、可命名的存储位置。它可以出现在赋值运算符的左边,也就是说,它是可以被赋值的对象。...示例:变量、数组元素、解引用的指针等。 用法:左值通常用于表示可以被修改的对象,但需要注意的是,有些左值可能是const的,即使是左值也不能修改。...左值和右值的主要区别 特性 左值(Lvalue) 右值(Rvalue) 持久性 是持久性的 是临时性的 可赋值性 可以出现在赋值运算符的左边 通常不能出现在赋值的左边 取地址 可以取地址 不能取地址 用途...不过在函数体中,调用了 Fun(t); 这一语句,**而此时的 t 却是完完全全的一个左值,因为右值引用变量的属性会被编译器识别成左值,否则在移动构造的场景下,无法完成资源转移,必须要修改。

    12910

    C++11新特性学习笔记

    循环,其for循环迭代的范围必须是可确定的: int func(int a[])//形参中数组是指针变量,无法确定元素个数 { for(auto e: a) // err, 编译失败 {...那么这个加法赋值表达式中,&a是允许的操作,但&(b + c)这样的操作则不会通过编译。因此a是一个左值,(b + c)是一个右值。 相对于左值,右值表示字面常量、表达式、函数的非引用返回值等。...无论是声明一个左值引用还是右值引用,都必须立即进行初始化。而其原因可以理解为是引用类型本身自己并不拥有所绑定对象的内存,只是该对象的一个别名。...*③* *可修改标示符* mutable声明,这部分可以省略。按值传递函数对象参数时,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)。...不过C++11标准却允许lambda表达式向函数指针的转换,但提前是lambda函数没有捕获任何变量,且函数指针所示的函数原型,必须跟lambda函数函数有着相同的调用方式。

    2.2K20

    详解decltype的用法

    c的类型,也就是说,auto推导变量依赖于初始化它的表达式,并且auto声明的变量必须初始;而decltype是直接通过某一个表达式来获取数据类型,从而定义d的类型。...表达式能做左值有两个典型的例子:decltype (*p)和decltype ((ii))。请看下面的例子: 对于解引用*p, 它代表的是p指向地址中的值,同时我们可以给这个值赋值,即为左值。...所以,decltype(*p)是int& ,这样才能有给绑定变量的值赋值的特点。 ii是一个变量,加上括号后变为表达式,即(ii)是一个表达式,又我们可以ii赋值,即为左值。...int ii = 42, *p = ⅈ decltype(*p) c;//错误,c是int&,必须初始化 decltype((ii)) d;//错误,d是int&,必须初始化 3. decltype...,也无法通过函数名来推断返回的函数类型,那么也无法返回函数指针,如下面的例子中声明pf为函数指针是错误的。

    89510

    C++11新特性学习笔记

    循环,其for循环迭代的范围必须是可确定的: int func(int a[])//形参中数组是指针变量,无法确定元素个数 { for(auto e: a) // err, 编译失败 {...那么这个加法赋值表达式中,&a是允许的操作,但&(b + c)这样的操作则不会通过编译。因此a是一个左值,(b + c)是一个右值。 相对于左值,右值表示字面常量、表达式、函数的非引用返回值等。...无论是声明一个左值引用还是右值引用,都必须立即进行初始化。而其原因可以理解为是引用类型本身自己并不拥有所绑定对象的内存,只是该对象的一个别名。...*③* *可修改标示符* mutable声明,这部分可以省略。按值传递函数对象参数时,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)。...不过C++11标准却允许lambda表达式向函数指针的转换,但提前是lambda函数没有捕获任何变量,且函数指针所示的函数原型,必须跟lambda函数函数有着相同的调用方式。

    2.1K20

    【深度剖析 C++11】 第二弹: 现代C++ 的关键版本和核心驱动

    泛左值(glvalue),泛左值包含将亡值(xvalue)和 左值(lvalue)。 2.1、纯右值:(prvalue) 纯右值是表达式求值过程中产生的临时值,或者用于初始化对象的字面量等。...4、完美转发 4.1、使用场景 上节课我们讲过,变量表达式都是左值属性,也就意味着⼀个右值被右值引用绑定后,右值引用变量在用于表达式时的属性是左值!!!...,传递给func时只会匹配左值引用的版本 //因为右值变量在用于表达式时的属性是左值!!...当使用混合捕捉时,第⼀个元素必须是 &或=,并且&混合捕捉时,后面的捕捉变量必须是值捕捉,同理=混合捕捉时,后面的捕捉变量必须是引用捕捉。...表达式之前,我们的使用的可调用对象只有函数指针和仿函数对象,函数指针的类型定义起来比较麻烦,使用起来也不方便。

    9110

    左值、左值引用,右值,右值引用

    c++11中引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能,用的不多,每次看过了就忘了,整理下; 1、左值和右值: 左值是指表达式结束后依然存在的持久化对象; 右值是指表达式结束时就不再存在的临时对象...; 比方: int i=0;// i是左值, 0是右值 2、左值引用: c++98中的引用很常见了,就是给变量取了个别名,在c++11中,因为增加了右值引用(rvalue reference)的概念,所以...int a = 10;  int& refA = a; // refA是a的别名, 修改refA就是修改a, a是左值,左移是左值引用 int& b = 1; //编译错误!...1是右值,不能够使用左值引用 3、右值引用,c++11中的右值引用使用的符号是&&,如: int&& a = 1; //实质上就是将不具名(匿名)变量取了个别名 int b = 1; int && c...对于存在指针变量的类来讲,其拷贝构造函数,赋值构造函数必须实现指针变量的深拷贝,这可能会涉及到比较耗时的操作(比如string 类存储了一个超长字符串,在调用其拷贝构造或赋值构造时需要超长字符串的拷贝)

    80010

    C++11知识点总结(全面解析C++11经常考到的知识点)

    () override; // 错误:foo 不能被覆盖,因为它在 A 中是 final }; class C : B // 错误:B 为 final { }; 6 智能指针 7....9.2 左值和右值 左值和右值的区别: 普通类型的变量,因为有名字,可以取地址,都认为是左值。...const修饰的常量,不可修改,只读类型的,理论应该按照右值对待,但因为其可以取地址(如果只是const类型常量的定义,编译器不给其开辟空间,如果对该常量取地址时,编译器才为其开辟空间),C++11认为其是左值...如果表达式的运行结果是一个临时变量或者对象,认为是右值。 如果表达式运行结果或单个变量是一个引用则认为是左值。...总结: 不能简单地通过能否放在=左侧右侧或者取地址来判断左值或者右值,要根据表达式结果或变量的性质判断,比如上述:c常量 能得到引用的表达式一定能够作为引用,否则就用常引用。

    2.1K10
    领券