一级指针易错点整理

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;
}

以上是关于一级指针易错点整理的主要内容,如果未能解决你的问题,请参考以下文章

指针指向空间的申请和释放易错点

图书管理系统易错点整理

3.易错点和新要掌握的内容

易错点整理

一些易错点的整理

JavaGuide易错点总结