一级指针易错点整理
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一级指针易错点整理相关的知识,希望对你有一定的参考价值。
易错点
越界问题
void test(){
char buf[3] = "abc";
printf("buf:%s\\n",buf);
}
末尾还有\\0
,应该设置buf[4]
指针叠加会不断改变指针指向
如下面案例,每次对p++,就修改了指针的指向
void test(){
char *p = (char *)malloc(50);
char buf[] = "abcdef";
int n = strlen(buf);
int i = 0;
for (i = 0; i < n; i++)
{
*p = buf[i];
p++; //修改原指针指向
}
free(p);
}
返回局部变量地址
如下面函数,如果返回str,当函数调用完后,系统会释放函数中的临时变量,最终就不能获得str里面的值,正确的应该用实际参数来保存当前字符串变量内容。
char *get_str()
{
char str[] = "abcdedsgads"; //栈区,
printf("[get_str]str = %s\\n", str);
return str;
}
同一块内存释放多次(不可以释放野指针)
void test(){
char *p = NULL;
p = (char *)malloc(50);
strcpy(p, "abcdef");
if (p != NULL)
{
//free()函数的功能只是告诉系统 p 指向的内存可以回收了
// 就是说,p 指向的内存使用权交还给系统
//但是,p的值还是原来的值(野指针),p还是指向原来的内存
free(p);
}
if (p != NULL)
{
free(p);
}
}
free()函数的功能只是告诉系统 p 指向的内存可以回收了(p 指向的内存使用权交还给系统),p的值还是原来的值(野指针),p还是指向原来的内存
例如下面程序,释放前后p的指向不变,只是告诉系统,可以回收了,系统去回收。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void test() {
int *p=NULL;
p = (int *)malloc(sizeof(int));
printf("释放前p指向:%d\\n",p);
free(p);
printf("释放后p指向:%d", p);
}
int main()
{
test();
return 0;
}
以上是关于一级指针易错点整理的主要内容,如果未能解决你的问题,请参考以下文章