首先应该明白两点:
1、C语言中,一维数组做参数时,编译器总是把它解析成一个指向数组首元素首地址的指针
2、所有非数组形式的数据实参均以传值的形式调用。(对实参做一份备份并传递给函数,函数不能修改实参本身,只能修改传给它的拿份备份)
一、数组作为参数
下面举一些例子:
void fun(char a[10])
{
char c = a[3];
}
int main(void)
{
char b[10] = "asdfg";
fun(b[10]);
return 0;
}
分析上面例子的错误:
1.fun(b[10]),出错,数组的范围是0-9,所有b[10]越界,不过这不是讨论重点
2.还是这一句,b[10]传进去的是什么?是一个值,它是char类型的,而函数接受的是char *类型
所以说,不能向函数传递一个数组,即使是fun(b),这样写,传进去的也是数组b首元素的首地址而已。如下,sizeof求出的长度为4,而不是10.
fun(b);
void fun(char a[10])
{
int i = sizeof(a);
}
所以,函数中,参数为数组还是这么写好了:
fun(char *) 或 fun(char a[])
二、指针作为参数
直接上例子:
void fun(char *p)
{
p = (char *)malloc(100);
}
int main(void)
{
char * str = NULL;
fun(str);
strcpy(str,"hello");
free(str); //没有起作用,内存泄漏
return 0;
}
内存泄漏是因为,str并没有分配到内存。所以载strcpy(str,“hello”)这里就出错了,可以看到str的值仍然是NULL。
上述例子说明,str作为参数传进去,不算它本身,而是它的备份。所以才没有成功分配内存。
要解决这个问题,可以用:
1、用return
char* fun(char *p)
{
p = (char*)malloc(100);
return p;
}
2、用二级指针
void fun(char **p)
{
*p = (char *)malloc(100);
}
int main(void)
{
char * str = NULL;
fun(&str);
free(str);
return 0;
}