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 和刻意避免用户操作内容所以没有明显的问题