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

为什么这会抛出一个c2109(不是指针或数组类型)

这个错误信息 c2109 通常出现在C++编程中,表示尝试对一个非指针或非数组类型的变量进行解引用操作。下面我将详细解释这个错误的基础概念、原因以及如何解决。

基础概念

在C++中,解引用操作(使用 * 运算符)只能应用于指针类型。如果你尝试对一个非指针类型的变量进行解引用,编译器就会抛出 c2109 错误。

错误原因

  1. 错误的变量类型:你可能错误地将一个非指针类型的变量当作指针来使用。
  2. 类型不匹配:在函数调用或赋值操作中,可能传递了一个非指针类型的变量,而函数期望的是一个指针。

示例代码

以下是一个会导致 c2109 错误的示例:

代码语言:txt
复制
int main() {
    int num = 10;
    std::cout << *num;  // 错误:num 不是指针类型
    return 0;
}

在这个例子中,num 是一个 int 类型的变量,而不是指针,因此尝试对其进行解引用操作会引发 c2109 错误。

解决方法

  1. 检查变量类型:确保你正在解引用的变量确实是指针类型。
  2. 使用正确的语法:如果你需要访问一个变量的值,直接使用变量名即可;如果需要通过指针访问值,则确保使用指针并进行正确的解引用。

修正后的代码如下:

代码语言:txt
复制
int main() {
    int num = 10;
    int* ptr = &num;  // 创建一个指向 num 的指针
    std::cout << *ptr;  // 正确:ptr 是指针类型,可以进行解引用
    return 0;
}

应用场景

这种错误常见于以下场景:

  • 函数参数传递:当你将一个非指针变量传递给期望指针参数的函数时。
  • 动态内存分配:在使用 newdelete 进行动态内存管理时,可能会混淆指针和非指针的使用。
  • 数据结构操作:在处理数组或自定义数据结构时,可能会错误地使用非指针变量。

总结

c2109 错误是由于尝试对非指针类型的变量进行解引用操作引起的。解决这个问题的关键是确保在进行解引用之前,变量确实是指针类型,并且在代码中正确地管理和使用指针。

通过上述方法,你可以有效地避免和解决这个常见的C++编译错误。

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

相关·内容

Rust避坑Java空指针异常

它发生在程序试图使用一个值为null的对象引用时。换句话说,当程序员试图通过一个空引用来访问对象的方法或属性时,程序就会抛出这个异常,并中止运行。什么时候会发生空指针异常?下面这些场景就会发生。...访问或修改null对象的字段。将null作为throw语句的参数。使用null对象进行同步(synchronized)。访问或修改数组的元素,而数组引用为null。...这里所讨论的Java踩坑Optional误用,以及之后的Rust避坑空指针异常,并不是暗示Java不如Rust好,而仅仅是为了提升自学者入门Rust的动力而已。...第22行调用printName(1),这会正常工作。第23行调用printName(2),这会抛出NoSuchElementException。在运行命令....访问数组越界。整数除以零。使用unwrap()方法处理None值或Err结果。

30161

Java基础——异常

,也不是一个好主意,远比我们通常意义上的条件语句( if/else 、 switch )要低效。...小范围或许可能,但是在大规模项目中,这么做可能不是个理智的选择。如果需要堆栈,但又没有收集这些信息,在复杂情况下,尤其是类似微服务这种分布 式系统,这会大大增加诊断的难度。...常见异常 1、NullPointerException 空指针异常,操作一个 null 对象的方法或属性时会抛出这个异常。...5、ClassNotFoundException 类找不到异常,Java开发中经常遇到,是不是很绝望?这是在加载类的时候抛出来的,即在类路径下不能加载指定的类。...看一个示例: 它是受检查异常,需要进行手工捕获。 ** 6、ClassCastException** 类转换异常,将一个不是该类的实例转换成这个类就会抛出这个异常。

55150
  • 数据结构——线性表(1)

    这样的组织架构是不是线性关系呢?   不是,为什么不是呢?哦,因为每一个元素,都有不只一个后继,所以它不是线性表。...班级同学的点名册,是不是线性表?是,这和刚才的友谊关系是完全不同了,因为它是有限序列,也满足类型相同的特点。...既然线性表的每个数据元素的类型都相同,所以可以用Java语言(其他语言也相同)的一维数组来实现顺序存储结构,即把第一个数据元素存到数组下标为0的位置中,接着把线性表相邻的元素存储在数组中相邻的位置。...顺序存储结构的插入与删除 插入 插入思路: 如果插入位置不合理,抛出异常 如果插入表的长度大于等于数组长度,则抛出异常或动态增容 从最后一位元素开始向前遍历到第i个位置,分别把它们都向后移动一个位置...有个别同学可能会问,数组的大小一定不可以变吗?我怎么看到有书中谈到可以动态分配的一维数组。是的,一般高级语言,比如 C、VB、C++都可以用编程手段实现动态分配数组,不过这会带来性能上的损耗。

    44440

    Arrays.sort()为什么不定义为接收一个Comparable[]数组?

    Arrays.sort()为什么不定义为接收一个Comparable[]数组?   ...这个方法要求Object[]数组中每一个元素都要实现Comparable接口,即提供compareTo(Object other)方法。一旦有某个元素没有实现该接口,将有可能抛出类型转换异常。   ...那么问题来了,为什么不强制要求传入一个Comparable[]数组呢?这样的话不就能够保证数组中每个元素都实现Comparable接口了吗? 1....从Java语言特性的角度分析   Java数组的类型不是由其元素类型决定的,而是由数组实例化时的类型决定的。也就是说,是在new Xxx[]的时候决定的。...但肯定有人说:那一开始都声明成Comparable[]数组或其协变类型的数组不就可以了吗?

    37910

    c++动态分配浅析

    需要注意的是:new的不是数组的话,则直接delete就好,并且只会调用一次析构函数,而new[]的话,则需使用delete[]来释放,并且数组中每一个元素都会调用一次析构函数,调用完析构函数再释放内存...4. new[]/delete[]的底层实现 简单数据类型(包括基本数据类型和不需要析构函数的类型) 对于简单数据类型而言,new[]调用的是operator new[],计算出数组总大小之后调用operator...复杂数据类型 对于复杂数据类型而言new[]先调用operator new[]分配内存,然后在指针的前四个字节写入数组大小,最后看分配了多少个元素就调用多少次构造函数,之所以要在前4个字节写入数组大小,...如果没有储存数组大小,编译器就不知道应该调用几次析构函数; new[]分配的内存只能由delete[]释放,如果由delete释放会崩溃,为什么会崩溃呢?...new 抛出异常,而返回空指针,如下: // 这样如果 new 失败了,就不会抛出异常,而是返回空指针 int* p = new (std::nothrow) int; if ( p == NULL

    67330

    synchronized凭什么锁得住?

    这也就解释了,为什么synchronized能对类加锁(因为每个类在堆内存中有一个Class对象,对于类synchronized锁的实际上是Class对象,下文会继续解释)。...对象头又分为:Mark Word、指向类的指针、数组长度(数组对象)。...JVM的研究者表明,大多数情况下锁的竞争不是那么激励,在不那么激励的时候如果通过获取Monitor来进行同步访问,会造成线程在操作系统用户态和核心态的转换,这会使得系统性能下降。...偏向锁表示,当只有一个线程进入同步方法或同步代码块时,并不会直接获取Monitor锁,而是先判断对象头中Mark Word部分的锁标志位是否处于“01”,如果处于“01”,此时再判断线程ID是否是本线程...而对于同步代码块,则在synchronized代码块开始执行了monitorenter,结束或者抛出异常时执行了monitorexit指令。

    50340

    Java中有关Null的9问题

    为什么在Java中需要学习null?因为如果你对null不注意,Java将使你遭受空指针异常的痛苦,并且你也会得到一个沉痛的教训。精力充沛的编程是一门艺术,你的团队、客户和用户将会更加欣赏你。...正如我说过的那样,null是Java中一个很重要的概念。null设计初衷是为了表示一些缺失的东西,例如缺失的用户、资源或其他东西。但是,一年后,令人头疼的空指针异常给Java程序员带来不少的骚扰。...5) 任何含有null值的包装类在Java拆箱生成基本数据类型时候都会抛出一个空指针异常。...你所做的一切是找到一个数字在数组中出现了多少次,这是Java数组中典型的寻找重复的技术。开发者首先得到以前的数值,然后再加一,最后把值放回Map里。...它将会抛出空指针异常,但是你可能不知道,你可以使用静态方法来使用一个值为null的引用类型变量。因为静态方法使用静态绑定,不会抛出空指针异常。

    1.2K50

    Java中有关Null的9件事

    为什么在Java中需要学习null?因为如果你对null不注意,Java将使你遭受空指针异常的痛苦,并且你也会得到一个沉痛的教训。精力充沛的编程是一门艺术,你的团队、客户和用户将会更加欣赏你。...正如我说过的那样,null是Java中一个很重要的概念。null设计初衷是为了表示一些缺失的东西,例如缺失的用户、资源或其他东西。但是,一年后,令人头疼的空指针异常给Java程序员带来不少的骚扰。...5) 任何含有null值的包装类在Java拆箱生成基本数据类型时候都会抛出一个空指针异常。...你所做的一切是找到一个数字在数组中出现了多少次,这是Java数组中典型的寻找重复的技术。开发者首先得到以前的数值,然后再加一,最后把值放回Map里。...它将会抛出空指针异常,但是你可能不知道,你可以使用静态方法来使用一个值为null的引用类型变量。因为静态方法使用静态绑定,不会抛出空指针异常。

    67520

    Android JNI学习(四)——JNI的常用方法的中文API

    参数解释 env:JNI接口指针 obj:局部、全局或弱全局引用 返回: JNIInvalidRefType=0:代表obj参数不是有效的引用类型 JNILocalRefType=1:代表obj参数是局部变量类型...下标不是一个有效的下标,则会抛出ArrayIndexOutOfBoundsException (四)、设置数组中某个元素的值 void SetObjectArrayElement(JNIEnv *env...参数解释: env:JNI接口指针 array:Java数组 index:数组下标 value:数组元素的新值 异常: 如果index不是有效下标,则会抛出ArrayIndexOutOfBoundsException...如果value不是元素类的子类,则会抛出ArrayStoreException (五)、创建基本类型数组系列 ArrayType NewArray(JNIEnv *env...* isCopy); 一组返回类型是基本类型的数组指针。

    3.4K20

    Java中有关Null的9件事

    为什么在Java中需要学习null?因为如果你对null不注意,Java将使你遭受空指针异常的痛苦,并且你也会得到一个沉痛的教训。精力充沛的编程是一门艺术,你的团队、客户和用户将会更加欣赏你。...正如我说过的那样,null是Java中一个很重要的概念。null设计初衷是为了表示一些缺失的东西,例如缺失的用户、资源或其他东西。但是, 一年后,令人头疼的空指针异常给Java程序员带来不少的骚扰。...5)任何含有null值的包装类在Java拆箱生成基本数据类型时候都会抛出一个空指针异常。...你所做的一切是找到一个数字在数组中出现了多少次,这是Java数组中典型的寻找重复的技术。开发者首先得 到以前的数值,然后再加一,最后把值放回Map里。...它将会抛出空指针异常,但是你可能不知道,你可以使用静态方法来使用一个值为null的引用类型变量。因为静态方法使用静态绑定,不会抛出空指针异常。

    57620

    一道算术题:ArrayDeque + ArrayList = LinkedList

    入栈的均摊时间复杂度分析 3.3 使用数组实现队列结构 使用数组实现队列相对复杂,我们需要一个队头指针和一个队尾指针: 队空: head == tail; 队满: tail == n(并不是真的满,只是无法填充新数据...(回答过多少次了,把手给我放下) ‍♀️疑问 3: 为什么 elements 字段不声明为泛型类型 E?...// 疑问 2:为什么字段都声明 transient 关键字? // 疑问 3:为什么 elements 字段不声明为泛型类型 E?...,不支持在数组的中间添加元素: 在队头添加: 在 head 指针的上一个位置赋值,如果数组越界则循环到数组尾部; 在队尾添加: 在 tail 指针的位置赋值,并将 tail 指针指向下一个位置,如果数组越界则循环到数组头部...如果数组越界则循环到数组尾部; 在队尾移除: 在 tail 指针的下一个位置获取,如果数组越界则循环到数组头部。

    50320

    【JAVA-Day28】数组下标越界问题:最佳解决方法

    一、什么是下标越界问题 程序中的数组通常是由一系列元素组成的,每个元素都有一个唯一的下标值来标识它在数组中的位置。下标通常从0开始,但也可以从1或其他任意整数值开始,具体取决于编程语言和数组类型。...,通常在使用指针或直接操作内存的编程语言(如C和C++)中发生。...这种错误通常导致程序崩溃或产生垃圾值,可能对系统造成严重影响。 常见情况 使用无效指针: 使用指针来访问内存地址时,如果指针指向无效的内存位置,就会导致内存访问错误。...int *ptr = NULL; // 指针指向空地址 *ptr = 42; // 这会导致内存访问错误 访问已释放的内存: 如果访问已经被释放的内存块,会导致未定义的行为,这可能包括程序崩溃或垃圾值的生成...如果是,我们返回对应的数组元素;如果不是,我们抛出IndexOutOfBoundsException异常,以提醒程序用户输入了无效的下标。 2.

    10010

    C语言 对数组名取地址

    作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算。这会出现什么样的结果呢?...为什么第二行须要强制转化类型呢? 答:a是一个一维数组的名字,&a相当于一个指向一维数组的指针。怎么感觉这么熟悉?指向数组的指针,那不就是行指针吗?int (*p)[]。...行指针+1,就是对指针进行加减操作,其结果还是一个行指针~~~原来如此,须要强制转换为单指针。...为什么? 答:上面不是说了嘛,&a就是一个行指针,那就是指向一行的指针咯。...移动五位都跑出a[]数组处于’ * ‘号位置了。哦,我看到printf()输出了。你输出的是*(p-1),这里p是一个单指针-1就是往左位移一位即可了,那不就是又回到5的位置了吗?

    1.7K20

    【C++】深入C++内存管理与多态:引用与指针、函数重载、新旧内存操作的全面解析

    函数重载 C++为什么支持函数重载,c语言不支持 C++代码产生函数符号的时候,函数名+参数列表类型组成 C代码产生函数符号的时候,函数名来决定。...C++与C语言之间如何互相调用 函数重载:一组函数,其函数名相同,参数列表的个数或者类型不同,那么这一组函数可就称为函数重载。(前提函数一定处在同一作用域下) 返回值类型与函数是不是重载不会影响。...new和delete称作运算符 new不仅可以做内存开辟,还可以做内存初始化操作 malloc开辟内存失败,是通过返回值和nullptr做比较的 new开辟内存失败,是通过抛出bad_alloc类型的异常...C++为什么会区分单个元素和·数组的·内存分配和·释放 new delete new[] delete[] 对于普通编译器内置类型 new/delet[] new[]/delete 可以混用,但是不推荐...对于自定义类类型,有析构函数,为了调用正确的析构函数,那么开辟对象数组的时候会多开辟4个字节,用于记录对象的个数。

    8710

    RuntimeException和非RuntimeException的区别「建议收藏」

    、数组越界访问和试图访问空指针等等。...例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。...3 异常的使用方法 声明方法抛出异常 ① 语法:throws(略) ② 为什么要声明方法抛出异常? 方法是否抛出异常与方法返回值的类型一样重要。...如何抛出异常 ① 语法:throw(略) ② 抛出什么异常?对于一个异常对象,真正有用的信息时异常的对象类型,而异常对象本身毫无意义。...应该声明方法抛出异常还是在方法中捕获异常?原则:捕捉并处理哪些知道如何处理的异常,而传递哪些不知道如何处理的异常。 再次抛出异常 ①为什么要再次抛出异常?

    2.6K10

    大小堆的实现

    (即当前节点不是根节点) { parent = (child - 1) / 2; // 根据二叉树的上序遍历规则计算出上一个父节点的索引位置(注意是除以2而不是减1)...) void HeapPop(Heap* hp) { assert(hp); // 断言检查hp是否为空指针,如果为空则直接返回或抛出异常 assert(hp->_a); // 断言检查堆的元素指针数组是否为空指针...assert(hp); // 断言检查hp是否为空指针,如果为空则直接返回或抛出异常 assert(hp->_a); // 断言检查堆的元素指针数组是否为空指针,如果为空则直接返回或抛出异常...hp); // 断言检查hp是否为空指针,如果为空则直接返回或抛出异常 assert(hp->_a); // 断言检查堆的元素指针数组是否为空指针,如果为空则直接返回或抛出异常 return...(hp->_a); // 断言检查堆的元素指针数组是否为空指针,如果为空则直接返回或抛出异常 if (hp->_size == 0) // 如果堆的元素个数为0 { return

    6910

    java开发人员最常犯的10种错误

    文章目录 一、把数组转成ArrayList 二、判断一个数组是否包含某个值 四、HashTable 和 HashMap 的选择 五、使用原始集合类型 六、访问级别 七、ArrayList与LinkedList...这个类虽然和java.util.ArrayList同名,但是并不是同一个类。...因为将数组压入Collection类型中,首先要将数组元素遍历一遍,然后再使用集合类做其他操作。...迭代器被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 迭代器会马上抛出...一个经典的实例就是连接大量的字符串,如果使用不可变的字符串,将会产生大量的需要进行垃圾回收的对象。这会浪费CPU大量的时间,使用可变对象才是正确的方案(比如StringBuilder)。

    15810

    c++ new和malloc的区别

    所以如果要动态分配一个数组的内存,还需要我们手动自定数组的大小:  int * ptr = (int *) malloc( sizeof(int) );//分配一个10个int元素的数组  7.new与...客户处理内存分配不足  在operator new抛出异常以反映一个未获得满足的需求之前,它会先调用一个用户指定的错误处理函数,这就是new-handler。...new_handler是一个指针类型:  namespace std {     typedef void (*new_handler)(); }  指向了一个没有参数没有返回值的函数,即为错误处理函数...总结  将上面所述的10点差别整理成表格:  特征new/deletemalloc/free分配内存的位置自由存储区堆内存分配失败返回值完整类型指针void*内存分配失败返回值默认抛出异常返回NULL分配内存的大小由编译器根据类型计算得出必须显式指定字节数处理数组有处理数组的...malloc给你的就好像一块原始的土地,你要种什么需要自己在土地上来播种  而new帮你划好了田地的分块(数组),帮你播了种(构造函数),还提供其他的设施给你使用:  当然,malloc并不是说比不上

    1K00
    领券