我们在学习C语言时,一般会觉得指针和数组没有本质的区别,然后滥用就会造成一些看起来莫名其妙的错误.
在我写一个将字符串转换成大写的形式的函数时,遇到了Segment Fault错误.上图:
开始以为是非法访问内存造成的,然而调试时,并没有发现引用不存在的内存这种情况出现.
要理解这个问题,我们首先需要理解,C程序在运行时,是如何使用内存的.
我找到了这么一张图片:
这里我们主要关注initialized data这个区域.
在这个区域中,包含了程序员初始化的变量.这个区域又被进一步划分成只读区和读写区.
当我们使用char pointer[] = “hello”时,它会被存储到读写区中.而当我们使用char *pointer = “hello”时,“hello”会被存储到只读区,而pointer这个指针会被存储到读写区.所以,我们使用指针修改只读区的时候,因为是undefined operation,所以会出现Segment Fault的异常.
关于C程序内存使用的更多说明,请看下面这个链接: http://www.geeksforgeeks.org/memory-layout-of-c-program/