经典 C 内存问题,愿来者给予详细讲解,不胜感激 ……
char *GetString(void){char *p = "hello world !" ;
return p ;
}
char *GetString(void){
char p[] = "hello world !" ;
return p ;
}
谁能比较详细的给我讲解一下当p为 p[] 和 *p 时的区别吗? *p是指针变量,可赋值;p[]中p是地址常量,不可赋值;两者都存在内存泄漏问题。
---我的理解。不知大家怎么看。 1,指针和数组的区别。
2,字符串的存储空间位置不一样
建议搂主和1楼读一下"expert c programming"这本书,对数组和指针有详细的描述。 这两个都有问题,无论是数组还是常量,生存期都是在函数以内,返回的指针会指向一个非法内存地址。 同意2楼和4楼说的;
char *GetString(void){
char *p = "hello world !" ;
return p ;
}
p是一个指针,指向字符串常量;这个地址是操作系统分配的;不在栈空间里面;
char *GetString(void){
char p[] = "hello world !" ;
return p ;
}
这个p数组定义时被初始化,是一个14个字节的字符数组,但是他的空间是在栈中分配的,作用域在函数中,离开了函数,他的地址就不能被访问了!
具体的话,楼主可以自己编一个小程序看看!
char *GetString1(void){
char *p = "hello world !" ;
printf("%0x",p);
return p ;
}
char *GetString2(void){
char p[] = "hello world !" ;
printf("%0x",p);
return p ;
}
int main()
{
char *p;
p = GetString1();
printf("%0x",p):
char *p2;
p2 = GetString2();
printf("%0x",p2);
return 1;
} 这两个都有问题,无论是数组还是常量,生存期都是在函数以内,返回的指针会指向一个非法内存地址。
第一个是没有问题的。只是不能修改返回的字符串的内容,因为是常量 这两个都有问题,无论是数组还是常量,生存期都是在函数以内,返回的指针会指向一个非法内存地址。
同意,不管是不是常量,生命期摆在那,出了这个区域它就over了,也许还能读到正确的串,那是因为这段内存还没被覆盖。 这两个都有问题,无论是数组还是常量,生存期都是在函数以内,返回的指针会指向一个非法内存地址。
同意,不管是不是常量,生命期摆在那,出了这个区域它就over了,也许还能读到正确的串,那是因为这段内存还没被覆盖。
第一个应该是正确的。
char *p = “hello world"; 虽然p是局部的,但这种声明方式,使"hello world"的内存区域是全局的;return p时,会复制p为_p(具体名字不确定),并都指向"hello world"的内存区域;虽然p已经消亡,但_p存在,也指向一个合法的内存,为什么会有问题呢?
页:
[1]