第九章 指针_C语言空指针NULL以及void指针

空指针 NULL

一个指针变量可以指向计算机中的任何一块内存,不管该内存有没有被分配,也不管该内存有没有使用权限,只要把地址给它,它就可以指向,C语言没有一种机制来保证指向的内存的正确性,程序员必须自己提高警惕。

很多初学者会在无意间对没有初始化的指针进行操作,这是非常危险的,请看下面的例子:

这段程序没有语法错误,能够通过编译和链接,但当用户输入完字符串并按下回车键时就会发生错误,在 Linux 下表现为段错误(Segment Fault),在 Windows 下程序直接崩溃。如果你足够幸运,或者输入的字符串少,也可能不报错,这都是未知的。

前面我们讲过,未初始化的局部变量的值是不确定的,C语言并没有对此作出规定,不同的编译器有不同的实现,我曾警告大家不要直接使用未初始化的局部变量。上面的代码中,str 就是一个未初始化的局部变量,它的值是不确定的,究竟指向哪块内存也是未知的,大多数情况下这块内存没有被分配或者没有读写权限,使用 gets() 函数向它里面写入数据显然是错误的。

我强烈建议对没有初始化的指针赋值为 NULL,例如:


                
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,指针是一种非常重要的数据类型,它可以指向其他数据类型的地址,使得程序可以直接访问这些数据。共享内存是一种进程之间共享数据的方式,可以让多个进程同时访问同一个内存区域。下面详细介绍如何在C语言中使用指针来传递类指针和共享内存。 首先,我们需要了解如何使用指针来传递类指针。在C++中,类指针是一种指向类对象的指针,它可以访问类的成员函数和成员变量。在C语言中,我们可以使用void指针来传递类指针。具体实现方法如下: ```c // 定义一个类 class MyClass { public: void func() { // 成员函数 } int value; // 成员变量 }; // 在C语言中使用void指针来传递类指针 void myFunc(void* ptr) { MyClass* myClassPtr = (MyClass*)ptr; // 将void指针转换为MyClass指针 myClassPtr->func(); // 调用类的成员函数 myClassPtr->value = 10; // 访问类的成员变量 } ``` 在上述代码中,我们首先定义了一个类MyClass,并在C语言函数myFunc中使用void指针来传递类指针。在函数内部,我们将void指针转换为MyClass指针,然后就可以使用类的成员函数和成员变量了。 接下来,我们来介绍如何在共享内存中传递类指针。在Linux系统中,我们可以使用shmget、shmat等函数来创建和操作共享内存。具体实现方法如下: ```c #include <sys/ipc.h> #include <sys/shm.h> // 定义一个类 class MyClass { public: void func() { // 成员函数 } int value; // 成员变量 }; // 创建共享内存 int createSharedMemory() { int shmid = shmget(IPC_PRIVATE, sizeof(MyClass), 0666|IPC_CREAT); if (shmid == -1) { perror("shmget error"); exit(EXIT_FAILURE); } return shmid; } // 将类指针附加到共享内存 MyClass* attachToSharedMemory(int shmid) { void* sharedMemory = shmat(shmid, NULL, 0); if (sharedMemory == (void*)-1) { perror("shmat error"); exit(EXIT_FAILURE); } return (MyClass*)sharedMemory; } // 分离共享内存 void detachFromSharedMemory(MyClass* myClassPtr) { if (shmdt(myClassPtr) == -1) { perror("shmdt error"); exit(EXIT_FAILURE); } } // 销毁共享内存 void destroySharedMemory(int shmid) { if (shmctl(shmid, IPC_RMID, NULL) == -1) { perror("shmctl error"); exit(EXIT_FAILURE); } } // 在共享内存中传递类指针 void myFunc(MyClass* myClassPtr) { // 共享内存中的类指针与传入的类指针指向同一个对象 myClassPtr->func(); // 调用类的成员函数 myClassPtr->value = 10; // 访问类的成员变量 } int main() { // 创建共享内存 int shmid = createSharedMemory(); // 将类指针附加到共享内存 MyClass* myClassPtr = attachToSharedMemory(shmid); // 在不同的进程中调用myFunc函数,共享内存中的类指针会被传递到另一个进程中 myFunc(myClassPtr); // 分离共享内存 detachFromSharedMemory(myClassPtr); // 销毁共享内存 destroySharedMemory(shmid); return 0; } ``` 在上述代码中,我们首先定义了一个类MyClass,并使用shmget、shmat等函数来创建和操作共享内存。在函数myFunc中,我们可以直接使用共享内存中的类指针来调用类的成员函数和成员变量。在不同的进程中调用myFunc函数,共享内存中的类指针会被传递到另一个进程中。 总之,在C语言中,我们可以使用指针来传递类指针和操作共享内存,这种方式可以让多个进程同时访问同一个内存区域,从而实现数据共享的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值