关于malloc分配内存的问题

zhyrs 2011-03-15 01:48:52
#include <iostream>
using namespace std;

int main()
{
char *p=NULL;
p="hello\n";
printf("---%s---%0x\n", p,&p);
p="world\n";
printf("---%s---%0x\n", p,&p);
p=NULL;
char *q = "nice to see you!";
p = q;
printf("---%s---%0x\n", p,&p);
char *ps[10];

char *ss;
for (int i=0; i<10; i++)
{
ss = (char *)malloc(10*sizeof(char));//此处需要重新分配内存?若没有这行将段错误?
sprintf(ss,"hello%d",i);
printf("%0x\n",&ss);
ps[i] = ss ;
}
for (int j=0; j<10; j++)
{
printf("------%s------\n",ps[j]);
}
return 0;
}
程序如上,为什么指针P可以随便用,不用申请内存也不会发生错误,而ss若不动态申请会发生段错误?
malloc什么时候必须用而什么时候可以不用?
...全文
90 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
AnYidan 2011-03-16
  • 打赏
  • 举报
回复
定义变量后,你可以初始化,也可以不初始化(留给compiler),
指针也是一种变量,只不过它是存储地址的

如果你不初始化指针,它存储的地址的地址可能指向任何地方,对其操作的危险性不可预知,所以大部分的编译器对此进行检查保护

看你的程序, p在每次调用前都指向明确的地址,编译器认为你知道你正在进行的操作将产生什么结果

而 ss 指向只有上帝才知道的地方,编译器认为你 不 知道你正在进行的操作将产生什么结果
Sco_field 2011-03-15
  • 打赏
  • 举报
回复
程序如上,为什么指针P可以随便用,不用申请内存也不会发生错误,而ss若不动态申请会发生段错误?
malloc什么时候必须用而什么时候可以不用?
------
你的P的若干操作:
p="hello\n";
p="world\n";
...
都是指针赋值操作,只是将字符串第一个字符的地址传给了p,而不是将整个字符串传给了p,不是字符串拷贝操作。
而后面的ss则不同。
你如果进行*p="dd"就会出现后面ss类似的问题了。

熄灭的太yang 2011-03-15
  • 打赏
  • 举报
回复
指针指向的是地址,如果不初始化的话就会乱指,指向一些不允许访问修改的内存空间,一些代码段,所以就会出现段错误。有malloc()就不出现错误主要是因为他返回了一个地址值给了ss。前面的p,q已经初始化为NULL,指向空地址,所以不会出现段错误
is2120 2011-03-15
  • 打赏
  • 举报
回复
1. P指向的是字符串常量,字符串常量由会放在内存的某个地方那个,有地址
2. ss某人初始化为NULL,这个是不可以解引用的;标准这么规定的
3. 你需要动态分配内存的时候就可以用呀。建议好好看下书吧。
witwolf 2011-03-15
  • 打赏
  • 举报
回复
hello
world
编译器已给这些数据分配了内存,它们存放在文字常量区,p能够引用它们

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧