不分配内存难道就不能用内存吗?

colin2185 2004-04-16 08:38:17
>>>>>> 我的迷惑,编译器到底想要什么样的信息,
何时它才非需要malloc来分配内存,
比如 我们定义 int *a[10],b,c;
a[0]=&b;a[1]=&c;
a[2]=(int*)malloc(sizeof(int)*5);
*a[0]=5;

大家看,数组a的前两个元素不用分配内存,就象int a=10;
int a[5];a[1]=2...等等一样自然,
直接写就好了,后面5个却分配了内存,为什么?
到底什么时候才真的需要动态分配,就是要用malloc

>>>> 有关指针初始化,int a;int *p;
p=&a;//right

为什么如果是p=10就不对呢??这样不也是初始化吗?
比如那个做swap的函数,swap(int *p1,int *p2){
int*temp;
*temp=*p1;//有问题吗?系统自然会给
*p1=*p2; temp有个地址,现在只用它所
*p2=*temp; 的值就可以,temp的地址始终是
不变的,不知道具体多少没关系啊

>>>>>>有关指针数组,
比如 char *argv[], 定义了一个数组的指针,每个指针都可以指向一个字符,
然后可以通过指针的运算得到一个字符串
那 int * a[], a中每个元素都可以指向一个整数,并且应该通过指针运算
也该得到它相邻的整数啊,可是结果行不通,
为什么?? c编译器并没有类型检查的
...全文
38 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
colin2185 2004-04-17
  • 打赏
  • 举报
回复
我的意思是既然能直接用,
为什么还要显式的申请内存空间?
比如字符串的拷贝,
1 char * str (char * des,char * src)
{ while(*des++=*src++);
return (des-1);}
2 char * str (char * des,char * src)
{ des=(char*)malloc(strlen(src)+1);
while(*des++=*src++);
return (des-1);}
3 还有一个叫strdup的函数
char * strdup(const char*s1)
{char * ptr;
if (ptr==malloc(strlen(s1)+1))
strcpy(ptr,s1);
return(ptr);
}

这三个函数是否都能正确执行拷贝,(1和2是我自己写的,
3 是看书上的),如果不行,为什么。如果都行,三者有
什么区别,什么时候用哪个??????
liem 2004-04-17
  • 打赏
  • 举报
回复
首先要清楚指针变量是什么?指针变量是存储内存的地址的变量。因此当我们定义了一个指针变量如char *s时,系统为该指针变量s分配内存(2或4个字节),并准备在这内存中存放一个地址。
如果没有为s赋一个地址值,那么里面的值是随机的,并不保证这是一个有效的内存地址,从而访问该内存(*s)时,要出问题的。
我们说为指针s分配内存是一种通俗的讲法,其含义是:向系统申请堆内存,并将申请到的内存的首地址赋给s。这样一来,s中值是有效地址了,我们可以通过访址(*s)向申请堆内存中写(或读)出有关数据。
针对你的三个函数:
1 char * str (char * des,char * src)
{ while(*des++=*src++);
return (des-1);}
这种情况用于des是已经定义的数组,或已经申请内存的指针

2 char * str (char * des,char * src)
{ des=(char*)malloc(strlen(src)+1);
while(*des++=*src++);
return (des-1);}
这一函数用于对应于形参des的实参是指针,,但还没有为实参申请内存的情况。如果已经为实参申请了内存,那么原先申请的内存就不能再访问了,造成内存泄漏。实参也不能是数组

3 char * strdup(const char*s1)
{char * ptr;
if (ptr==malloc(strlen(s1)+1))
strcpy(ptr,s1);
return(ptr);
}
这一函数我们使用的是它返回值,我们可以用它为一个没申请内存的指针赋值,如:
char *s=strdup("abcd");如果不使用其返回值,那么调用该函数是无用的。
BuW 2004-04-16
  • 打赏
  • 举报
回复
学习!~~~~~~~~~~
freefalcon 2004-04-16
  • 打赏
  • 举报
回复
555,没有刷性,上面都说过了
当我没说
freefalcon 2004-04-16
  • 打赏
  • 举报
回复
补充:
1. 对于通过malloc动态申请的内存,一旦申请成功,所获得的内存区域就归你了,除非你通过free显示释放
int a, *p = &a; 虽然可以,但你必须保证a的生命期比p长,或者保证在a的生命期结束后,你不能再通过p访问a
2. int* p = 10; 不可以,是因为类型不匹配,实际上int* p = (int*)10;是允许的,这样,p就成了指向内存地址为10的int型指针,但这样做很危险,你只能读(这也受操作系统限制),不能写
moswawa 2004-04-16
  • 打赏
  • 举报
回复
2。
C除了支持整数0(NULL)和指针的赋值外,不支持其它整数和指针的赋值,
但你可以强制把整数转换成地址赋给他。
p = (int *)10;
yonyon 2004-04-16
  • 打赏
  • 举报
回复
数组a的前两个元素指向变量b和c,系统分配内存,
系统会在变量生存期外清理内存

后面5个元素是程序主动申请空间,要显式释放
a[1]=2是将地址2赋值给a[1]而不是a[1]指向的的变量为2

建议楼主好好看一下指针的基础部分
moswawa 2004-04-16
  • 打赏
  • 举报
回复
比如 我们定义 int *a[10],b,c;
a[0]=&b;a[1]=&c;
a[2]=(int*)malloc(sizeof(int)*5);
*a[0]=5;

大家看,数组a的前两个元素不用分配内存,就象int a=10;
int a[5];a[1]=2...等等一样自然,
直接写就好了,后面5个却分配了内存,为什么?
到底什么时候才真的需要动态分配,就是要用malloc
..............................................
a[2]=(int*)malloc(sizeof(int)*5); 不是给a[2]分配地址,只是把一个地址值赋给了它,
和a[0] = &a;本来就没什么区别啊
happlyman 2004-04-16
  • 打赏
  • 举报
回复
第一个问题:到底什么时候才真的需要动态分配,就是要用malloc
int *a[10] 这句话是定义了一个指针数组,它也分配了内存,用来存指针,
a[0]=&b 现在a[0]就是一个已经有了内存的变量,它用来存储int*类型的数据,你把b的地址    给了它,b的地址也是一个值呀,所以只有a[0]已经有了内存才能把b的地址放进去
a[2]=(int*)malloc(sizeof(int)*5);这个也一样,只不过是你自己和系统要了一块内存来,然后把它的地址给了a[2],之后你还要用free来释放它,把它还给系统。

第二个问题:
为什么如果是p=10就不对呢??这样不也是初始化吗?

类型不一样怎么能行呢,指针是一种类型,10是一个整型,类型不一样所以p = 10不成立,而*p则是整型,所以*p = 10就成立。


char *argv[];这个定义不是“定义了一个数组的指针”,而是定义了一个数组,数组中元素的类型是char*,所以它是每个元素都可以指向一个字符串,

int *a[];这个一样,每个元素都可以指向一个整型值



69,381

社区成员

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

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