后知后觉,今天才发现原来malloc返回的地址的性质是“常量指针”。
1.首先来看看平时的使用,一般如下
int main()
{
char * p = (char *)malloc(sizeof(char) * 2);
p[0] = 'A';
p[1] = 'B';
printf("%c %c\n", p[0], p[1]);
return 0;
}
malloc申请了两字节空间,我们对其分别赋值后输出,程序正常,结果如下:
A B
请按任意键继续. . .
2.上面使用[]对其内存进行写操作,接下来我们通过指针的自增试试同样的写操作,代码如下:
int main()
{
char * p = (char *)malloc(sizeof(char) * 2);
*p = 'A';
p++;
*p = 'B';
printf("%c %c\n", p[0], p[1]);
return 0;
}
笔者开始以为其结果和上面一样,然而并不是:
B ?
请按任意键继续. . .
从结果可以看处,p++并没有被执行,语句“*p = 'B'”覆盖了“*p = 'A'”所以在输出中仅有第一个字节是B,第二个字节?.
而这也符合常量指针的性质:指针不允许自增、自减等操作.所以笔者才有此推断.
3.为了更有效的证明,笔者接下来直接显示的将p定义为常量指针:
int main()
{
char * const p = (char *)malloc(sizeof(char) * 2);
*p = 'A';
p++;
*p = 'B';
printf("%c %c\n", p[0], p[1]);
return 0;
}
编译时直接在p++处报错了:
严重性代码说明项目文件行
错误C3892“p”: 不能给常量赋值c_testd:\c及c++编程练习\c相关\程序员面试笔记c语言深度解析例子\c_test\c_test\main.cpp40
。结论:只能说malloc返回带有“常量"的性质,不过从表面上看是非显性的。
4.这也是为什么在一些地方需要辅助指针了,譬如上述代码一定要求通过指针进行操作的话,可以改为如下形式:
int main()
{
char * const p = (char *)malloc(sizeof(char) * 2);
char * q = p;
*q = 'A';
q++;
*q = 'B';
printf("%c %c\n", p[0], p[1]);
return 0;
}
其输出结果和1中相同,通过局部指针q间接的修改了p的内容。