c语言中的一些指正和局部变量所带来的隐患

132 阅读3分钟

感谢永哥

// test1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdlib.h>
#include <string.h>

static char* glob_p1=NULL;

static void prvPrintTask(void *pvParameters){
	int iIndexToString;
	iIndexToString = (int)pvParameters;
	printf("iIndexToString:%d\n",iIndexToString);

	//short int c1 = (char)pvParameters; // xx1 
	//double d1 = (double)pvParameters; // xx8

	


	char* p = (char*)iIndexToString;
	printf("iIndexToString:%s\n",p);



 }

void test2(){
	int *p = NULL;
	int i = 100;
	p = &i;
	printf("test2->p %X\n",p);
	printf("test2->i %d\n", i);
}


char* testMalloc(char* p){
	p = (char*)malloc(10);
	memset(p,0,10);
	strcpy(p,"12345");
	return p;
}
char* testMalloc1(char** p){
	*p = (char*)malloc(10);
	memset(*p,0,10);
	strcpy(*p,"12345");
	return *p;
}

char* testArray(char* p){
	char arr[]="12345";
	p = arr;
	return p;
}
void test4(){
	glob_p1= (char*)malloc(10);
	memset(glob_p1,0,10);
	strcpy(glob_p1,"12345");
 
}


int _tmain(int argc, _TCHAR* argv[])
{
	/*char arry[]="abcdefg";

	void* pv0= arry;
	void* pv1= &arry[1];

	prvPrintTask(pv0);
	prvPrintTask(pv1);
	system("pause");*/

	//test2();
	//printf("main->p, %X", p);
	
	char* p0=NULL;
	char* p1=NULL;
	char* p2=NULL;
	char* p3 =NULL;


	test4();

	p3 = testMalloc1(&p0);
	p3=NULL;
	p3 = testMalloc(p1);
	char* pp1 = testArray(p2);
	char a1[20]={0};
	strcpy(a1,testArray(p2));

	printf("p2: %s", p3);
	printf("p1: %s", p1);
	printf("p2: %s", p2);
	
	system("pause");

	return 0;
}
prvPrintTask函数中他的形参接受一个void *型的指针。传入的指正可以被强制转型,如果传入的指针为(void *)100,这个参数是把100强制转型成指针的形式
传入函数中,在函数中就可以被转型成其他的形式。这是我在FreeRTOS中用到的函数的形式

char* testArray(char *p);函数有隐患,入过在main函数中使用语句p3 = testArray(p2)的话,程序将存在内存隐患,因为在testArray函数结束后返回的指针所

指向的那一片内存已经不可控了,(函数运行结束,所有的临时变量将会变的不可控,虽然存储的数据可能没有被抹除,但是我们已经不能够控制这块内存,

他随时可以被使用,造成隐患),在输出P3的时候我们可以得到正确的结果,因为p3的地址是函数返回的地址,这个地址确实是指向这一块内存的,但是这块

内存将会随时被更改。所以会造成隐患。

使用

strcpy(a1,testArray(p2));

是安全的因为他将函数所返回的指针所指向的内存拷贝到了另外一个内存中,从而可以避免内存释放所带来的困扰

要时刻牢记,在C语言中所有传入函数的形参都是参数的拷贝,即使是指针也不例外。或许认为在函数中修改指针所指向的值,函数结束后修该被保存下来了。其实不是这样的。

在你传入的参数为指针的时候,函数中有了一个和你传入地址完全相同的指针的拷贝。这时候就会出现两个指针同时指向一个内存的情况,要修改指针所指向的值必然会使用*号来改变,这个时候,你是通过指针的拷贝

来修改内存中所存储的变量,这块内存并不是在函数中的,所以在函数结束后这块内存并不会被释放。然而如果你在函数中修改了指针所指向的地址,你所修改的只是传入函数的拷贝。对原指针是不会有影响的。

综上牢记,在C语言中函数结束后函数中的内存将会被释放(malloc所产生的内存要显示的回收,他并不会被自动释放),内存变为不可控,虽然可能值并未被擦出,但如果使用将会对程序产生无法预料的后果。所有传入函数的参数都是参数的拷贝\