QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2999|回复: 8

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

[复制链接]
发表于 2007-1-10 17:23:11 | 显示全部楼层 |阅读模式
char *GetString(void){
        char *p = "hello world !" ;
        return p ;
}
char *GetString(void){
        char p[] = "hello world !" ;
        return p ;
}
谁能比较详细的给我讲解一下当p为 p[] 和 *p 时的区别吗?
发表于 2007-1-10 19:44:18 | 显示全部楼层
*p是指针变量,可赋值;p[]中p是地址常量,不可赋值;两者都存在内存泄漏问题。
---我的理解。不知大家怎么看。
回复

使用道具 举报

发表于 2007-1-11 12:08:41 | 显示全部楼层
1,指针和数组的区别。
2,字符串的存储空间位置不一样

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

使用道具 举报

发表于 2007-1-17 09:39:32 | 显示全部楼层
这两个都有问题,无论是数组还是常量,生存期都是在函数以内,返回的指针会指向一个非法内存地址。
回复

使用道具 举报

WeiMingzhi 该用户已被删除
发表于 2007-1-17 15:56:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 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;
}
回复

使用道具 举报

发表于 2007-4-16 13:51:48 | 显示全部楼层
[quote:3943b36c0e="WeiMingzhi"][quote:3943b36c0e="bywind"]这两个都有问题,无论是数组还是常量,生存期都是在函数以内,返回的指针会指向一个非法内存地址。[/quote]

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 00:24 , Processed in 0.055977 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表