Mad Pointer in C

        在C语言中,变量variable的类型是定义得非常死板的。没有一个特殊类型的变量能被强制转换成其他的类型。或者任意类型的变量能直接强制转换成为一个特殊类型。的确,这样的特殊类型在C语言中是不存在的。

        但是,我们可以找到一个特殊的指针去实现这样万能的转换。这样特殊的使命就交给一个最常用的,但是却最不理解的类型void*。没错,void是一个特殊的类型。说他特殊是因为你不能只样去定义 void a; 这样定义要不你不能使用这样变量b(TC2),要不就直接是编译出错(C-FREE)。实在是相当令人琢磨不透的东西。但是void类型的指针却是一个非常usefull的pointer。我们看下面一个例子:

#include "stdio.h"
int main(void){
    void *p = NULL;
    int a = 100;
        p = &a;//任何类型的指针都可以转换为void*
        printf("%d",*(int*)p);//输出的时候再强制转换回来
}

不知道路过的朋友看到这里会不会了解这样的功能究竟有什么用~我想大家都能猜测得到了,我将要这个特殊的指针去实现一般C语言实现不了的东西----面向对象。

我在学Java的时候突然领悟到,那些所谓在Java中的类其实不过都是一些结构体,Java中的类的创建、调用、传递、销毁、继承、接口等等操作无非都是对指针进行操作。既然C语言中也有指针,那为什么我不能用C语言来实现面向对象呢?OO In C

当然有些人会说,用一种语言去实现另外一种语言这不是很无聊吗?非也非也,面向对象和面向结构的区别仅仅在于是表现形式的不同。引用一句经典的话来说就是,石墨和钻石都是由同一种元素构成的,但是碳原子之间的组成方式不一样,表现就完全不一样了。此话甚为经典。

[ 2830.840525][ T4357] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000038 [ 2830.842010][ T4357] Mem abort info: [ 2830.842793][ T4357] ESR = 0x0000000096000044 [ 2830.843685][ T4357] EC = 0x25: DABT (current EL), IL = 32 bits [ 2830.844787][ T4357] SET = 0, FnV = 0 [ 2830.845589][ T4357] EA = 0, S1PTW = 0 [ 2830.846408][ T4357] FSC = 0x04: level 0 translation fault [ 2830.847425][ T4357] Data abort info: [ 2830.848254][ T4357] ISV = 0, ISS = 0x00000044 [ 2830.849148][ T4357] CM = 0, WnR = 1 [ 2830.849937][ T4357] user pgtable: 4k pages, 48-bit VAs, pgdp=0000000102693000 [ 2830.851162][ T4357] [0000000000000038] pgd=0000000000000000, p4d=0000000000000000 [ 2830.852472][ T4357] Internal error: Oops: 0000000096000044 [#1] SMP [ 2830.853593][ T4357] Modules linked in: virtio_rdma(E+) ib_uverbs(E) ib_core(E) xt_CHECKSUM xt_MASQUERADE xt_conntrack ipt_REJECT nf_nat_tftp nf_conntrack_tftp nft_fib_inet nft_fib_ipv4 nf t_fib_ipv6 nft_fib nft_reject_inet nf_reject_ipv4 nf_reject_ipv6 nft_reject bridge nft_ct stp llc nft_chain_nat nf_tables ebtable_nat ebtable_broute ip6table_nat ip6table_mangle ip6table_raw ip6table_security iptable_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 libcrc32c iptable_mangle iptable_raw iptable_security rfkill ip_set nfnetlink ebtable_filter ebtables ip6tabl e_filter ip6_tables iptable_filter ip_tables sunrpc vfat fat arm_smccc_trng sch_fq_codel fuse ext4 mbcache jbd2 virtio_gpu virtio_dma_buf drm_shmem_helper crct10dif_ce ghash_ce drm_kms_helpe r sha2_ce sha256_arm64 virtio_net net_failover sha1_ce virtio_blk failover virtio_mmio dm_mirror dm_region_hash dm_log dm_multipath dm_mod virtio_pci virtio_pci_legacy_dev virtio_pci_modern_ dev virtio virtio_ring aes_neon_bs aes_neon_blk aes_ce_blk aes_ce_cipher [ 2830.867784][ T4357] CPU: 7 PID: 4357 Comm: insmod Kdump: loaded Tainted: G E 6.4.0 #3 [ 2830.869442][ T4357] Hardware name: QEMU KVM Virtual Machine, BIOS 0.0.0 02/06/2015 [ 2830.870894][ T4357] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=–) [ 2830.872368][ T4357] pc : create_qp+0x90/0x238 [ib_core] [ 2830.873585][ T4357] lr : create_qp+0x1c4/0x238 [ib_core] [ 2830.874795][ T4357] sp : ffff80000c52b670 [ 2830.875802][ T4357] x29: ffff80000c52b670 x28: 0000000000000038 x27: 0000000000000000 [ 2830.877295][ T4357] x26: ffff8000014bc960 x25: ffff0000c3995000 x24: 0000000000000000 [ 2830.878795][ T4357] x23: ffff0000c39cad00 x22: 0000000000000000 x21: ffff8000014bc960 [ 2830.880291][ T4357] x20: ffff80000c52b750 x19: 0000000000000010 x18: ffffffffffffffff [ 2830.881776][ T4357] x17: 0000000000000020 x16: 0000000000000000 x15: ffffffffffffffff [ 2830.883276][ T4357] x14: 0000000000000000 x13: 3020737574617473 x12: 0000000000000001 [ 2830.884762][ T4357] x11: 00000000ffff7fff x10: ffff80000a043268 x9 : ffff80000848232c [ 2830.886260][ T4357] x8 : ffff80000c52b7b8 x7 : ffff80000146fb48 x6 : ffff0000c39928f8 [ 2830.887753][ T4357] x5 : ffff8000014bc960 x4 : 0000000000000000 x3 : 0000000000000000 [ 2830.889254][ T4357] x2 : 0000000000000000 x1 : 0000000000000dc0 x0 : 0000000000000038 [ 2830.890755][ T4357] Call trace: [ 2830.891658][ T4357] create_qp+0x90/0x238 [ib_core] [ 2830.892820][ T4357] ib_create_qp_kernel+0x50/0x128 [ib_core] [ 2830.894087][ T4357] create_mad_qp+0x9c/0x118 [ib_core] [ 2830.895318][ T4357] ib_mad_port_open+0x1bc/0x500 [ib_core] [ 2830.896569][ T4357] ib_mad_init_device+0x6c/0x1e0 [ib_core] [ 2830.897831][ T4357] add_client_context+0x13c/0x208 [ib_core] [ 2830.899111][ T4357] enable_device_and_get+0xd4/0x1b8 [ib_core] [ 2830.900409][ T4357] ib_register_device.part.0+0x104/0x1d8 [ib_core] [ 2830.901759][ T4357] ib_register_device+0x34/0x50 [ib_core] [ 2830.903018][ T4357] virtio_rdma_register_ib_device+0x90/0xb8 [virtio_rdma]
04-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值