C结构体指针 malloc函数问题 麻烦解释哪里错了,越细致越好。

#include <stdio.h>
struct teacher
{
int age;
char *s;
};
int main()
{
struct teacher tarry[3];
struct teacher *p;
p=tarry;
int i;
for(i=0;i<3;i++)
{
&tarry[i]=(struct teacher*)malloc(3*sizeof(struct teacher));
}

}
一定要解释清楚。

程序一共有两个地方出现错误,分别如下:

1、调用malloc函数需包含头文件<stdlib.h>,故应在第二行加上#include<stdlib.h>;

2、数组定义之后,数组占用的内存位置以及中某个元素的地址是不能随意改变的;故不能重新为数组分配内存地址,更不能对数组某一个元素的地址赋值。因此,for循环的循环体中,&tarry[i]属于不可修改的左值,不能被赋值。当你定义struct teacher tarry[3]之后,系统已经静态为tarry数组分配了内存,不能通过malloc重置。

在你结构体和对象定义都不改变的情况下,你是无法给tarry重新分配内存空间的,只能给p分配内存空间。如果你实在需要给tarry重新分配内存空间,可以考虑将struct teacher tarry[3]改成struct teacher *tarry变成指针,然后用melloc分配三倍你要分配给一个元素的内存空间:

tarry=(struct teacher*)malloc(9*sizeof(struct teacher));

追问

你能从内存四区的角度,来谈谈
数组定义之后,数组占用的内存位置以及中某个元素的地址是不能随意改变的
吗?

追答

嗯,不客气。类似于tarry[3]这样的静态数组,在程序编译的过程中就由编译器自动在内存栈区分配了空间;完成定义之后数组地址作为一个地址常量储存在栈区,数组名作为常量指针指向栈区的地址常量已不可改变。正是由于数组名是常量指针,因而不能再通过代码改变指针使其指向程序员通过malloc等在堆区分配的内存空间,因此就不能通过重新分配改变数组的地址。
数组中某个元素的地址同理;array是常量指针,array+i同样是常量指针,指向栈区地址不可改变。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-04-05
一、int main是需要返回值的
二、&tarry[i]=(struct teacher*)malloc(3*sizeof(struct teacher));赋值号左边的应该是一个指针变量,数组名是不能存储地址的
相似回答