鱼C论坛

 找回密码
 立即注册
查看: 1904|回复: 6

字符串的存储问题

[复制链接]
发表于 2014-5-10 17:56:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
char* p;
scanf("%s",p);
p所指向的那个字符串存在内存中的什么地方(就是在堆、栈、全局\静态存储区、 常量存储区,。。。我感觉哪个也对不上)
我用字符串连接函数在p所指向的字符串后头接上几个字符串有没有可能出错?

另外一个与之相关的问题,是不是这么写时一般都会给p分配空间而不是像我上面那种写法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-10 20:13:38 | 显示全部楼层

回帖奖励 +5 鱼币

char* p;这个p如果是局部变量,其值是随机的,也就是说,它可能指向堆、栈、全局\静态存储区、 常量存储区任何一个地方。
scanf("%s",p);意思就是向任何地方强制写一段数据。在运行时刻,这种粗鲁的行为会被操作系统进制(如果不禁止,则有可能发生更可怕的后果,比如正好把一些非常重要的系统参数该覆盖了)
这种错误称为“野指针”错误(就是指针值没有初始化),是初学者经常犯的错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-10 21:23:49 | 显示全部楼层

回帖奖励 +5 鱼币

本帖最后由 oggplay 于 2014-5-10 21:27 编辑

首先:你的程序虽然能编译通过,编译器给不给警告我不知道,但会遇到运行错误,正确的是:

#define BUFFSIZE 1024

char p[BUFFSIZE]; scanf("%s",p)

其次:字符串数组p[]在什么地方,完全取决于你定义的位置,如果你定义在函数里,那它就是局部变量,就在堆栈里边,如果你定义在main上边,那就是全局变量,那他就会定义在全局变量的位置。或者全局缓存变量里边。汇编里叫.section .bss
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-10 22:03:27 | 显示全部楼层

回帖奖励 +5 鱼币

你这好像不行吧,会核心转储错误。系统要分多大的空间给你,它都不知道。指针的位置也没给出,所以是随机的取决于p的内存原来的0 ,1 吗。这样不安全的。应该是首先包含头文件#include<stdlib.h> ,然后宏定义#define SIZE 20  最后main函数内改为char* p = malloc char[SIZE];  最最后别忘了free掉。这样字符串会存在堆里。        应该是这样吧。函数内定义的局部变量存在栈内,也就是p是在栈内。 static修饰的局部变量存在静态存储区。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-13 15:45:45 | 显示全部楼层

回帖奖励 +5 鱼币

为鱼币~~~~~~~~~~~~~~~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-14 17:25:27 | 显示全部楼层

回帖奖励 +5 鱼币

对不起,我只为鱼币而来。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-14 21:28:25 | 显示全部楼层
scanf 的原形是這樣的
int scanf(const char *format, ...);

都說要const了, 所以要給定一個確定的size
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 22:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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