打印

经典 C 内存问题,愿来者给予详细讲解,不胜感激 ……

经典 C 内存问题,愿来者给予详细讲解,不胜感激 ……

char *GetString(void){
        char *p = "hello world !" ;
        return p ;
}
char *GetString(void){
        char p[] = "hello world !" ;
        return p ;
}
谁能比较详细的给我讲解一下当p为 p[] 和 *p 时的区别吗?
23

TOP

*p是指针变量,可赋值;p[]中p是地址常量,不可赋值;两者都存在内存泄漏问题。
---我的理解。不知大家怎么看。

TOP

1,指针和数组的区别。
2,字符串的存储空间位置不一样

建议搂主和1楼读一下"expert c programming"这本书,对数组和指针有详细的描述。

TOP

这两个都有问题,无论是数组还是常量,生存期都是在函数以内,返回的指针会指向一个非法内存地址。

TOP

[quote:011e64a2ac="bywind"]这两个都有问题,无论是数组还是常量,生存期都是在函数以内,返回的指针会指向一个非法内存地址。[/quote]

第一个是没有问题的。只是不能修改返回的字符串的内容,因为是常量
   

TOP

同意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;
}
坚持一个目标

TOP

[quote:3943b36c0e="WeiMingzhi"][quote:3943b36c0e="bywind"]这两个都有问题,无论是数组还是常量,生存期都是在函数以内,返回的指针会指向一个非法内存地址。[/quote]

第一个是没有问题的。只是不能修改返回的字符串的内容,因为是常量[/quote]
Mike

TOP

[quote:ca874d4158="bywind"]这两个都有问题,无论是数组还是常量,生存期都是在函数以内,返回的指针会指向一个非法内存地址。[/quote]
同意,不管是不是常量,生命期摆在那,出了这个区域它就over了,也许还能读到正确的串,那是因为这段内存还没被覆盖。

TOP

[quote:5b36a66693="mozilla"][quote:5b36a66693="bywind"]这两个都有问题,无论是数组还是常量,生存期都是在函数以内,返回的指针会指向一个非法内存地址。[/quote]
同意,不管是不是常量,生命期摆在那,出了这个区域它就over了,也许还能读到正确的串,那是因为这段内存还没被覆盖。[/quote]

第一个应该是正确的。
char *p = “hello world"; 虽然p是局部的,但这种声明方式,使"hello world"的内存区域是全局的;return p时,会复制p为_p(具体名字不确定),并都指向"hello world"的内存区域;虽然p已经消亡,但_p存在,也指向一个合法的内存,为什么会有问题呢?

TOP