c语言中出现段错误的原因:
1、数组越界;
2、非法操作空间;(操作空指针或者野指针)
3、修改常量区的内容。
main函数传参:
函数名:main
形参:
1、统计当前传入形参的个数(自动统计)
2、存储传入的参数各自首地址的指针数组
如何传参:
通过命令行操作
eg:./a.out aa bb cc
以上等价于传入参数的个数为4个,即:argc=4;
argv数组中存储以上每一个字符串的首地址
int main(int argc, const char *argv[])
函数和指针的结合
函数指针
概念:返回值类型是指针类型的函数
能造成以上问题的原因:因为定义的数组是一个局部数组,存在生命周期的限制,
申请空间:malloc
函数原型:void * malloc(size_t size);
功能:用来在堆区申请一片连续的内存空间
参数:所申请空间的字节数
返回值:成功代表申请空间的首地址,失败返回值为NULL
释放空间:free
函数原型:void free(void *pstr);
功能:释放一片空间
参数:malloc成功后的返回值
返回值:空
扩容空间:realloc
函数原型:void * realloc(void * ptr,size_t size);
功能:扩容空间(注意:扩容之后的空间可能在之前旧空间基础之上再扩充了一段,也可能找到了一个更大更新的空间,此时返回值就会和之前旧空间地址不一样)
参数:①malloc的返回值(所需扩容空间的首地址)
②扩容之后的总字节数。
返回值:成功扩容之后空间的首地址(可能与之前的一样,也可能不一样),失败返回值NULL
重置空间:memset
函数原型:void *memset(void *s, int c, size_t n);
功能:用来重置一片连续的空间(按照字节)
参数:①重置空间的首地址
②重置空间的字符
③重置空间的大小(用sizeof测试即可)
malloc应用:
引用:
指针传递的误区:
通过指针传递参数时,最大的忌讳就是以为只要参数是指针就可以了,实际上,应该首先确定要修改的变量的类型,然后再将其地址作为参数。如果要修改的变量本身就是指针,就应该将指针的地址作为参数,此时的形参类型就是指向指针的指针。
例如:
则正确写法为:
函数的本质:存在于内存中的一段有头有尾的二进制代码
调用函数:执行这一段有头有尾的二进制代码
如何找到这一段代码:找到首地址
函数指针:
概念:指向函数的指针
函数指针的定义格式:
存储类型 返回值类型 (*指针变量名)(形参列表);
函数名:函数入口地址,意味着函数调用的时候,就是根据函数名对应的地址空间进行调用