【关于C语言动态内存分配的问题】

qq_34251172 2016-03-11 01:01:42

求解答,为什么可以在不知道内部大小的情况下分配动态内存呢?如果后面再详细定义难道会自动realloc吗?
源代码如下 或者对代码觉得可以怎么改的请指出来呢 这个代码貌似输出日期还有点问题

/*1.定义一个日期结构体,结构成员包括年、月、日。
2. 定义一教师结构体,结构体成员包括:雇员姓名(用字符指针)、家庭地址(用字符指针)、
出生日期(用日期结构体指针类型)。
3. 动态分配3个教师,初始化其值并输出,最后释放所有动态分配的内存。
*/
#include "stdafx.h"
#include "stdlib.h"
#include "string.h"

typedef struct date{
int year;
int mouth;
int day;
}date ;
typedef struct teach{
char *pName;
char *paddres;
date *pdate;
}teach ;
void printf(teach *p,int n);
int main(int argc, char* argv[])
{
teach *psteach;
int i;
psteach=(teach *)malloc(sizeof(teach)*3);
for (i=0;i<3;i++)
{
psteach[i].pName=(char *)malloc(30);
psteach[i].paddres=(char *)malloc(30);
psteach[i].pdate=(date *)malloc(sizeof(date));
}
strcpy(psteach->pName,"Tom");
strcpy(psteach->paddres,"Beijing");
psteach->pdate->year=1999;
psteach->pdate->mouth=6;
psteach->pdate->day=20;
strcpy(psteach[1].pName,"peter");
strcpy(psteach[1].paddres,"shanghai");
psteach->pdate->year=1996;
psteach->pdate->mouth=2;
psteach->pdate->day=19;
strcpy(psteach[2].pName,"pig");
strcpy(psteach[2].paddres,"guangzhou");
psteach->pdate->year=2006;
psteach->pdate->mouth=5;
psteach->pdate->day=25;
printf(psteach,3);
printf("241 林树益!\n");
for (i=0;i<3;i++)
{
free(psteach[i].pName);
free(psteach[i].paddres);
free(psteach[i].pdate);
}
free(psteach);
getchar();
return 0;

}
void printf(teach *p,int n){
int i;
for (i=0;i<n;i++)
{
printf("姓名=%s 地址=%s 出生日期=%d \n",p->pName,p->paddres,p->pdate->year,p->pdate->mouth,p->pdate->day);
p++;
}
printf("\n");
}
...全文
170 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_34251172 2016-03-11
  • 打赏
  • 举报
回复
引用 2 楼 github_27756899 的回复:
malloc(sizeof(tech));处理后 pName ,padress , pdate 本身已经有空间了,但是值未定.(空间存放值)。 psteach[i].pName=(char *)malloc(30);(char *)malloc(30); 申请空间存放值(pName),使指针指向申请的空间。
typedef struct date{ //日期结构体类型 int day; int month; int year; }setDate; typedef struct teacher{ //教师结构体类型 char *name; char *address; setDate *birthday; }setTeacher; void main(){ setTeacher *staff; int i; staff=(setTeacher *)malloc(sizeof(setTeacher)*3); for(i=0;i<3;i++) { /* 先进行动态内存分配 */ staff[i].name=(char *)malloc(20); staff[i].address=(char *)malloc(20); staff[i].birthday=(setDate *)malloc(sizeof(setDate)); } //通过strcpy把名字和地址赋值给指针字符串数组 strcpy(staff[0].name,"Lu Shan"); strcpy(staff[1].name,"Zhi Feng"); strcpy(staff[2].name,"Chun Guo"); strcpy(staff[0].address,"BeiJing"); strcpy(staff[1].address,"ShangHai"); strcpy(staff[2].address,"ShenZhen"); //通过指针数组.birthday指向year 或者 month 或者 day staff[0].birthday->year=1996; staff[0].birthday->month=07; staff[0].birthday->day=14; staff[1].birthday->year=1995; staff[1].birthday->month=3; staff[1].birthday->day=10; staff[2].birthday->year=1970; staff[2].birthday->month=9; staff[2].birthday->day=25; 大大,可以最后一个问题吗~就是我的 "."和"->"使用得正确吗?因为我觉得,和->我比较模糊。可以解释一下吗 拜托了QAQ
qq_34251172 2016-03-11
  • 打赏
  • 举报
回复
引用 2 楼 github_27756899 的回复:
malloc(sizeof(tech));处理后 pName ,padress , pdate 本身已经有空间了,但是值未定.(空间存放值)。 psteach[i].pName=(char *)malloc(30);(char *)malloc(30); 申请空间存放值(pName),使指针指向申请的空间。
所以就是动态分配都是需要需要定值的对吧 如果是通过sizeof()定义的都是需要后面定义具体数值是嘛
starytx 2016-03-11
  • 打赏
  • 举报
回复
代码里的psteach变量后边都要有中括号下标才可以
gh_99 2016-03-11
  • 打赏
  • 举报
回复
malloc(sizeof(tech));处理后 pName ,padress , pdate 本身已经有空间了,但是值未定.(空间存放值)。 psteach[i].pName=(char *)malloc(30);(char *)malloc(30); 申请空间存放值(pName),使指针指向申请的空间。
赵4老师 2016-03-11
  • 打赏
  • 举报
回复
指针的大小是确定的。

69,373

社区成员

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

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