龙空技术网

C语言指针易错用法总结

霸都嵌入式 134

前言:

目前各位老铁们对“static在c语言里什么用法”大体比较注意,大家都需要分析一些“static在c语言里什么用法”的相关内容。那么小编也在网摘上搜集了一些对于“static在c语言里什么用法””的相关内容,希望咱们能喜欢,我们一起来学习一下吧!

C语言指针是一种强大但也容易出错的工具,它可以让我们直接操作内存中的数据,但也可能导致一些难以发现和排除的错误。以下是一些指针易错用法的总结和纠正方法:

- 使用未初始化的指针。指针变量在定义时必须初始化,否则它会存储一个随机的地址,这个地址可能是无效的或者已经被其他变量占用。如果我们试图通过未初始化的指针访问或修改内存中的数据,就可能造成段错误或者数据混乱。例如:

```c

int *p; // 未初始化的指针

*p = 10; // 将10写入一个随机的地址,可能会覆盖其他变量或者引发段错误

```

为了避免这种错误,我们应该在定义指针时就给它赋一个有效的地址,或者将它初始化为NULL表示空指针。例如:

```c

int a = 10;

int *p = &a; // 将a的地址赋给p

*p = 20; // 将20写入a所在的地址,修改a的值

int *q = NULL; // 将q初始化为NULL

if (q != NULL) { // 检查q是否为空指针

*q = 30; // 如果不为空,才进行访问或修改

}

```

- 返回局部变量的地址。局部变量是定义在函数内部的变量,它们只在函数执行期间存在,当函数返回后,它们所占用的内存空间就会被释放。如果我们试图返回一个局部变量的地址,就相当于返回了一个无效的地址,这个地址可能会被其他函数或变量使用。如果我们试图通过这个地址访问或修改数据,就可能造成段错误或者数据混乱。例如:

```c

int* givP() {

int never_try_this = 0; // 局部变量

return &never_try_this; // 返回局部变量的地址

}

int main() {

int *ret = givP(); // 接收返回的地址

printf("%p\n", ret); // 打印地址

printf("%d\n", *ret); // 试图访问该地址,可能会引发段错误或者输出错误的数据

return 0;

}

```

为了避免这种错误,我们应该返回一个动态分配的内存地址,或者使用静态变量或全局变量。例如:

```c

int* givP() {

int *p = (int*)malloc(sizeof(int)); // 动态分配内存空间

*p = 0; // 初始化值为0

return p; // 返回动态分配的内存地址

}

int main() {

int *ret = givP(); // 接收返回的地址

printf("%p\n", ret); // 打印地址

printf("%d\n", *ret); // 访问该地址,输出正确的数据

free(ret); // 释放动态分配的内存空间

return 0;

}

```

- 混淆指针和数组。指针和数组在C语言中有很多相似之处,但也有很多不同之处。我们不能将它们等同起来,否则就可能造成一些逻辑上或者语法上的错误。例如:

```c

int a[5] = {1, 2, 3, 4, 5}; // 定义一个数组a

int *p = a; // 定义一个指针p,并将a的首元素地址赋给p

printf("%d\n", sizeof(a)); // 输出数组a所占用的字节数,即5*4=20

printf("%d\n", sizeof(p)); // 输出指针p所占用的字节数,即4或者8,取决于系统位数

printf("%p\n", a); // 输出数组a的首元素地址

printf("%p\n", &a); // 输出数组a的地址,与首元素地址相同

printf("%p\n", p); // 输出指针p的值,即数组a的首元素地址

printf("%p\n", &p); // 输出指针p的地址,与数组a的地址不同

printf("%d\n", a[0]); // 输出数组a的第一个元素,即1

printf("%d\n", *a); // 输出数组a的首元素地址所指向的数据,即1

printf("%d\n", p[0]); // 输出指针p所指向的数据,即1

printf("%d\n", *p); // 输出指针p的值所指向的数据,即1

a++; // 错误,数组名是一个常量,不能进行自增或自减运算

p++; // 正确,指针可以进行自增或自减运算,使其指向下一个或上一个元素

```

为了避免这种错误,我们应该明确指针和数组的区别和联系。指针是一个变量,它存储一个地址,可以通过这个地址访问或修改内存中的数据。数组是一种数据结构,它存储一组相同类型的数据,可以通过下标访问或修改每个元素。指针可以指向数组的某个元素,也可以通过指针来遍历和操作数组。但是指针和数组在内存中占用的空间、表示方式、运算规则等方面都有不同。我们不能将它们混为一谈,而应该根据具体情况选择合适的方式来使用它们。

标签: #static在c语言里什么用法