mrzoro67 发表于 2014-5-10 17:56:58

字符串的存储问题

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

另外一个与之相关的问题,是不是这么写时一般都会给p分配空间而不是像我上面那种写法

仰望天上的光 发表于 2014-5-10 20:13:38

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

oggplay 发表于 2014-5-10 21:23:49

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

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

#define BUFFSIZE 1024

char p; scanf("%s",p)

其次:字符串数组p[]在什么地方,完全取决于你定义的位置,如果你定义在函数里,那它就是局部变量,就在堆栈里边,如果你定义在main上边,那就是全局变量,那他就会定义在全局变量的位置。或者全局缓存变量里边。汇编里叫.section .bss

Prophet 发表于 2014-5-10 22:03:27

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

动感超人xx 发表于 2014-5-13 15:45:45

为鱼币~~~~~~~~~~~~~~~~~~~

Kayllen 发表于 2014-5-14 17:25:27

对不起,我只为鱼币而来。。。。

kikiatw 发表于 2014-5-14 21:28:25

scanf 的原形是這樣的
int scanf(const char *format, ...);

都說要const了, 所以要給定一個確定的size
页: [1]
查看完整版本: 字符串的存储问题