C结构体指针 malloc函数问题 麻烦解释哪里错了,越细致越好。
#include<stdio.h>structteacher{intage;char*s;};intmain(){structteachertarry[3];struct...
#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));
}
}
一定要解释清楚。 展开
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同样是常量指针,指向栈区地址不可改变。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询