yueyemingming 发表于 2007-1-10 17:23:11

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

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

zhangbinbin 发表于 2007-1-10 19:44:18

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

cybershot 发表于 2007-1-11 12:08:41

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

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

bywind 发表于 2007-1-17 09:39:32

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

WeiMingzhi 发表于 2007-1-17 15:56:12

lovechinesepeop 发表于 2007-4-3 11:57:16

同意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;
}

Mikeandmore 发表于 2007-4-16 13:51:48

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

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

mozilla 发表于 2007-5-22 13:37:48

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

ttec_pq 发表于 2007-6-14 17:29:55

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

第一个应该是正确的。
char *p = “hello world"; 虽然p是局部的,但这种声明方式,使"hello world"的内存区域是全局的;return p时,会复制p为_p(具体名字不确定),并都指向"hello world"的内存区域;虽然p已经消亡,但_p存在,也指向一个合法的内存,为什么会有问题呢?
页: [1]
查看完整版本: 经典 C 内存问题,愿来者给予详细讲解,不胜感激 ……