当我们在 C 语言中使用指针时,需要注意指针的空指针问题。空指针是指指向内存中地址为 0 的指针,通常用 NULL 宏表示。当我们对空指针进行解引用操作时,程序会抛出异常,导致崩溃。因此在使用指针前,应该先判断指针是否为空。
使用指针前正确判断指针是否为空
通常情况下,我们在使用指针前应该先判断指针是否为空。可以使用 if 语句判断指针是否为空,例如:
int* ptr = NULL; // 定义一个指向整型数据的空指针
if (ptr == NULL) { // 判断指针是否为空
printf("ptr is NULL\n");
}
同样,也可以使用三目运算符进行指针是否为空的判断:
int* ptr = NULL; // 定义一个指向整型数据的空指针
printf("%s\n", (ptr == NULL) ? "ptr is NULL" : "ptr is not NULL");
空指针的使用示例
接下来我们来看两个关于空指针的使用示例:
示例一
在程序中,我们定义了一个指向结构体的指针。在函数中判断指针是否为空,如果不为空则打印指针所指向的结构体中的变量。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int x;
int y;
} Point;
void printPoint(Point *p) {
if (p != NULL) {
printf("Point(%d, %d)\n", p->x, p->y);
}
}
int main() {
Point *p = NULL;
p = (Point*)malloc(sizeof(Point));
if (p != NULL) {
p->x = 10;
p->y = 20;
printPoint(p);
}
free(p);
return 0;
}
在上面的代码中,我们首先定义了一个结构体 Point,其中包含两个 int 类型的成员变量 x 和 y。接着,我们在 printPoint 函数中判断了指针 p 是否为空,如果不为空则打印指针所指向的结构体中的变量。
在 main 函数中,我们先将指针 p 初始化为空指针,然后使用 malloc 分配了一块大小为 Point 结构体大小的内存,将其赋给指针 p。接着判断指针是否为 NULL,如果不为 NULL,则为结构体成员变量 x 和 y 赋值,并调用 printPoint 函数输出 Point 结构体中的成员变量 x 和 y。最后,释放指针 p 所指向的内存。
示例二
在程序中,我们定义了一个指向字符串的指针。在函数中使用 strncpy 函数将字符串拷贝到指针所指向的内存中,并判断指针是否为空。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void copyStr(char *s) {
if (s != NULL) {
strncpy(s, "Hello World!", 13);
}
}
int main() {
char *s = NULL;
s = (char*)malloc(sizeof(char)*14);
if (s != NULL) {
copyStr(s);
printf("%s\n", s);
}
free(s);
return 0;
}
在上面的代码中,我们首先定义了一个指向字符串的指针 s,并将其初始化为空指针。接着,在 copyStr 函数中我们使用 strncpy 函数将字符串 "Hello World!" 拷贝到 s 所指向的内存中,并判断指针是否为空。在 main 函数中,我们使用 malloc 函数分配了一块大小为 14 字节的内存,并将指针 s 指向这块内存,并判断指针是否为空。如果不为空,则调用 copyStr 函数将字符串拷贝到 s 所指向的内存中,并使用 printf 输出字符串。最后,释放指针 s 所指向的内存。
总结:正確使用 NULL 宏對 C 語言中的指針進行空指針判斷,避免程序崩潰。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言指针使用问题-测试NULL - Python技术站