C 比较难理解指针的概念,经常与数组放在一起来讲,比如
char msg1[] = "hello world";
char *msg2 = &msg1[0];
此时, msg1
与 msg2
指向同一个内存位置,但由于类型的不同,sizeof
结果也不同
前者为 12,后者为 8(64位机器)
因此我们得出结论,数组可以转换为指针,通过对数组元素引用(取址)生成指针,但对于下面的代码
char* foo()
{
char msg[] = "hello world";
return msg;
}
char* bar()
{
char* msg = "hello world";
return msg;
}
int main()
{
printf( "%s\n", foo() );
printf( "%s\n", bar() );
return 0;
}
调用 foo
时,会报段错误;而 bar
却能够正常获取结果。
造成区别的原因在于:
alloca
从栈里申请空间,但大小受限,且不可调整malloc()
和 free()
主动申请和释放,因为忘记释放会造成内存泄漏realloc
调整大小.rodata
中)static
,但对于并行造成困难list
列表中添加新的元素需要从堆中申请,但由于有 gc 和刻意避免用户操作内容所以没有明显的问题