lovehhliu 2021-03-17 22:10 采纳率: 100%
浏览 73
已采纳

C语言一个结构体指针的问题,不明白请指点

#include<stdio.h>

typedef struct test{
	int a;
	int b;
}TEST_ST;

typedef struct hello{
	int m;
	TEST_ST *v;
}SOURCE_DATA;

SOURCE_DATA *creat_data2()
{
	SOURCE_DATA *data_m=NULL;

	data_m = calloc(1,sizeof(SOURCE_DATA));

	data_m->v = malloc(sizeof(TEST_ST));

	printf("data_v addr = %p\n",data_m->v);

	printf("data_v0-a addr = %p\n",&(data_m->v[0].a));
	printf("data_v0-b addr = %p\n",&(data_m->v[0].b));
	printf("data_v1-a addr = %p\n",&(data_m->v[1].a));
	printf("data_v1-b addr = %p\n",&(data_m->v[1].b));
	printf("data_v2-a addr = %p\n",&(data_m->v[2].a));
	printf("data_v2-b addr = %p\n",&(data_m->v[2].b));
	printf("data_v3-a addr = %p\n",&(data_m->v[3].a));
	printf("data_v3-b addr = %p\n",&(data_m->v[3].b));
	printf("data_v4-a addr = %p\n",&(data_m->v[4].a));
	printf("data_v4-b addr = %p\n",&(data_m->v[4].b));

	data_m->m = 2;

	data_m->v[0].a =3;
	data_m->v[0].b =4;
	data_m->v[1].a =3;
	data_m->v[1].b =4;
	data_m->v[2].a =8;
	data_m->v[2].b =7;
	data_m->v[3].a =4;
	data_m->v[3].b =4;
	data_m->v[4].a =4;
	data_m->v[4].b =5;

	return data_m;
}

void creat_data(SOURCE_DATA *data)
{
	SOURCE_DATA *data_tmp=NULL;

	data_tmp = creat_data2();

	memcpy(data,data_tmp,sizeof(SOURCE_DATA));


//	if(data_tmp->v)
//	{
//		free(data_tmp->v);
//		data_tmp->v = NULL;
//	}

	if(data_tmp)
	{
		free(data_tmp);
		data_tmp = NULL;
	}

}

int main(void)
{

		SOURCE_DATA data={0};

		creat_data(&data);

		printf("end data m = %d\n",data.m);

//		printf("data v = %p\n",data.v);
		printf("end data0  = %d\n",data.v[0].a);
		printf("end data0_ = %d\n",data.v[0].b);
		printf("end data1  = %d\n",data.v[1].a);
		printf("end data1_ = %d\n",data.v[1].b);
		printf("end data2  = %d\n",data.v[2].a);
		printf("end data2_ = %d\n",data.v[2].b);
		printf("end data3  = %d\n",data.v[3].a);
		printf("end data3_ = %d\n",data.v[3].b);
		printf("end data4  = %d\n",data.v[4].a);
		printf("end data4_ = %d\n",data.v[4].b);

//		free(data.v);

}

请教个C问题没有想明白。请大家给个解答。

这个代码里的第19行,data_m->v = malloc(sizeof(TEST_ST)),这句只申请了8个字节的空间,为什么v对应的数组超出8个字节后还能正常存储数值啊?

这个data_m->v 申请的内存,怎么样释放?若是在第59行释放,只能释放申请的8个字节,但为什么v[1]到v[4]还能有数据?

  • 写回答

1条回答 默认 最新

  • Charon_cc 2021-03-17 22:31
    关注

    是这样的,在C语言里面,如果你使用的超出了申请的内存空间,其实还是可以继续用的,程序不会报错,因为malloc函数和calloc函数都只是给你一个首地址,你申请到这个首地址之后就算越界了,之后对越界之后的内存进行赋值操作,都不会报错。你自己可以测试一下,用一个指针指向一个数组,然后你的指针一直移动,超出了数组范围之后得到的乱码而不是报错。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 matlab appdesigner私有函数嵌套整合
  • ¥15 给我一个openharmony跑通webrtc实现视频会议的简单demo项目,sdk为12
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题