范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

零基础学C语言知识总结十一动态内存分配

  动态内存分配(动态存储期)
  在程序执行并使用该变量的时候分配内存空间,使用完毕立即释放.
  动态内存分配就 是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据 程序的需要即时分配,且分配的大小就是程序要求的大小。
  当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。
  在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道我们要定义的这个数组到底有多大,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。
  即使你知道你想利用的空间大小,但是如果因为某种特殊原因空间利用的大小有增加或者减少,你又必须重新去修改程序,扩大数组的存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。
  我们用动态内存分配就可以解决上面的问题. 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
  从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点:
  1、不需要预先分配存储空间;
  2、分配的空间可以根据程序的需要扩大或缩小。
  常见的动态内存错误:
  (1)对NULL指针进行解引用操作
  (2)对分配的内存进行操作时越过边界
  (3)释放并非动态分配的内存
  (4)试图释放一块动态分配的内存的一部分以及一块内存被释放之后被继续使用。
  说明:
  1、动态分配最常见的错误就是忘记检查所请求的内存是否成功分配。
  2、动态内存分配的第二大错误来源是操作内存时超出了分配内存的边界。
  当你使用free时,可能出现各种不同的错误:
  1、传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。
  2、传递给free函数一个指针,让它释放一块并非动态分配的内存可能导致程序立即终止或在晚些时候终止。
  3、试图释放一块动态分配内存的一部分也有可能引起类似问题。 //实例:动态内存分配实现可变长一维数组
  #define _GRT_SECURE_NO_WARNNGS
  #include
  #include
  #include"array.h"//这个头文件 里边包含一个结构表示数组和下列函数的声明原型
  const Block_size = 20;///一次增容20个存储空间
  /*
  Array array_creat(int ints_size); //创建一个数组
  void array_free(Array *a);//回收空间
  int array_size(const Array *a);//查看当前数组大小
  int *array_at(Array *a, int index);//访问数组
  void array_inlate(Array *a, int more_size);//增容
  */
  int main(void) {
  Array a;//表示数组初始值的大小
  int i, j,n,m=0;
  while (1) {
  printf("请输入你需要多大的数组: ");
  scanf("%d", &n);
  a = array_creat(n);//这个可得到a里边返回的参数
  printf("输入数据  ");
  for (i = 0; i < n; i++) {
  scanf("%d", &j);
  *array_at(&a, i) = j;//这个函数相当与是数组 把j的值保存到数组里边的元素中去
  }
  printf("输出数据: ");
  for (i = 0; i < n; i++) {//遍历输出
  printf("%d ", a.arrray[i]);
  printf(" ");
  }
  printf(" ");
  printf("输入1初始化数组大小,输入其他表示退出程序: ");
  scanf("%d", &n);
  if (n == 1) {
  m = 0;//清零
  j = 0;
  array_free(&a);//释放之前的内存
  }
  else {
  exit(0);//退出程序
  }
  }
  return 0;
  }
  Array array_creat(int ints_size) //创建一个数组
  {
  Array a;//定义一个数组的结构体
  a.size=ints_size; //表示数组的长度
  a.arrray = (int *)malloc(sizeof(int)*a.size);//前一个int*是强制类型转换,后面的表示一个int 是4个字节 总共就是长度乘以
  return a;//返回的作用是 让主函数调用它时,能够得到它的参数
  }
  void array_free(Array *a)//回收空间
  {
  free(a->arrray);
  a->arrray = NULL;//让指针指空 不至于成为野指针
  a->size = 0;
  }
  //封装
  int array_size(const Array *a)//查看当前数组大小
  {
  return a->size;
  }
  int *array_at(Array *a, int index)//访问数组
  {
  if (index >= a->size) {
  //下面的公式是为了算出Block_size的底在哪
  //比如130,如果直接加20要加两次,但是用公式就一次完成
  array_inlate(a, (index / Block_size + 1)*Block_size - a->size);//在原来的基础上加20个
  }
  //返回指针 加括号是为了保持优先级不出错
  return &(a->arrray[index]); //如果返回的是值,那将不能被改变,返回指针就可以进行操作了
  }
  void array_inlate(Array *a, int more_size)//增容
  {
  int *p = (int*)malloc(sizeof(int)*(a->size+more_size));//重新申请一块更大的内存 100 +20
  int i;
  for (i = 0; i < a->size; i++) {//把之前数组的内容拷贝到新的数组中去
  p[i] = a->arrray[i];
  }
  free(a->arrray);//把之前的数组释放
  a->arrray = p;//将指针改变指向 重定向
  a->size += more_size;//大小加上新增的
  }
  /*程序演示:
  请输入你需要多大的数组:
  5
  输入数据   1 2 3 4 5   输出数据:   1
  2
  3
  4
  5
  输入1初始化数组大小,输入其他表述退出程序:   1
  请输入你需要多大的数组:   6
  输入数据   1 2 3 4 5 6   输出数据:   1
  2
  3
  4
  5
  6
  输入1初始化数组大小,输入其他表述退出程序:   0
  进程1520已退出.返回代码为 0.   按任意键关闭此窗口...//实例:动态内存分配实现可变长二维数组   #include   #include   int main(void)   {   int n, m;   scanf("%d %d", &n, &m);//n=5 m=2 按照自己输入 来确定二维数组的大小   int **p = (int **)malloc(sizeof(int *) * n);//利用二级指针 申请五行元素   //p是一个二级指针 malloc函数返回一个int* 的类型 sizeof(int*)表示乘以的指针类型的大小   /*、申请m个能够能够存放 int* 类型的空间,并将首地址返回给一个二维指针p;   内存可能的分布情况:   int a < -- int *; < -- int **p;   int b < -- int *;   int c < -- int *;   int d < -- int *;   */   // (int **) 一个*表示强制类型转换,另一个表示指针 int *   //sizeof(int*),不能少*,一个指针的内存大小,每个元素是一个指针。用指针长度乘以数量 (int*)*n   // 这个p指针的数据类型是个二级指针,它指向的这个空间里放的是些一级指针   for (int i = 0; i < 5; i++)//每行有两列元素   {   p[i] = (int *)malloc(sizeof(int) * m);//每个元素是int大小 4*m 将元素保存到每一行   //每一个一级指针值的大小 指向一个实际大小的空间   // *(p+i) = p[i] 每一次移动表示行的移动   }   //赋值   for (int i = 0; i < n; i++)   {   for (int j = 0; j < m; j++)   {   p[i][j] =1;   //*(*(p + i) + j) = p[i][j]   }   }   for (int i = 0; i < n; i++)   {   for (int j = 0; j < m; j++)   {   //输出数组每个元素值和地址   printf("%d=%p ", p[i][j],&p[i][j]);   }   printf(" ");   }   for (int i = 0; i < n; i++) {//按 行 释放指针   free(p[i]);   }   free(p);//释放整体   return 0;   }   /*程序演示:   5 2   1=010F44C0 1=010F44C4   1=010F4378 1=010F433C   1=010F4330 1=010F4374   1=010FAB60 1=010FAB64   1=010FAD98 1=010FAB94   进程8432已退出.返回代码为 0.   按任意键关闭此窗口...   const 函数(补充)   之前一直把这个关键字漏掉了现在补上,const 限定符,它把一个对象转换成一个常量,C语言中const关键字是constant的缩写,通常翻译为常量、常数等,有些朋友一看到const关键字马上就想到了常量。事实上在C语言中const功能很强大,它可以修饰变量、数组、指针、函数参数等。   1、修饰变量:   在程序中使用const修饰变量,就可以对变量声明为只读特性,并保护变量值以防被修改。如下:   const int i = 5; 变量i具有只读特性,不能够被更改;若想对i重新赋值,如i = 10;则是错误的。   值得注意的是,定义变量的同时,必须初始化。定义形式也可以写成int const i=5,同样正确。   此外,const修饰变量还起到了节约空间的目的,通常编译器并不给普通const只读变量分配空间,而是将它们保存到符号表中,无需读写内存操作,程序执行效率也会提高。   2、修饰数组   C语言中const还可以修饰数组,举例如下:   const int array[5] = {1,2,3,4,5};   array[0] = array[0]+1; //错误   数组元素与变量类似,具有只读属性,不能被更改;一旦更改,如程序将会报错。   3、修饰函数参数   const关键字修饰函数参数,对参数起限定作用,防止其在函数内部被修改。所限定的函数参数可以是普通变量,也可以是指针变量。举例如下:   void fun1(const int i)   i++; //对i的值进行了修改,程序报错   void fun2(const int *p)   (*p)++; //对p指向空间的值进行了修改,程序报错   保护数组中的元素:   为了避免函数的意图不是为了修改数组当中的数据内容,那么在函数原始声明定义中时应使用关键字const,如:   int sum(const a[ ],int n); 这段代码告诉编译器,该函数不能修改a所指向的数组中的内容,如果在函数中不小心使用类似a[i]++;的表达式,那么程序将会报错。   要注意的是,这样使用const并不是要求原数组是常量,而是该函数在处理数组时将其视为常量,不可修改,这样使用const可以保护数组当中的数据不被修改。   4、修饰指针   C语言中const修饰指针要特别注意,共有两种形式,一种是用来限定指向空间的值不能修改;另一种是限定指针不可更改。举例说明如下:   int i = 5;   int j = 6;   int k = 7;   const int * p1 = &i; //定义1   int * const p2 =&j; //定义2   上面定义了两个指针p1和p2。   在定义1中const限定的是 * p1,即其指向空间的值不可改变,若改变其指向空间的值如*p1=20,则程序会报错;但p1的值是可以改变的,对p1重新赋值如p1=&k是没有任何问题的。   在定义2中const限定的是指针p2,若改变p2的值如p2=&k,程序将会报错;但*p2,即其所指向空间的值可以改变,如 * p2=80是没有问题的,程序正常执行。   关于指针赋值和const需要注意一些规则:   1、把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的   2、可以声明并初始化一个不能指向别处的指针,关键是const的位置,这时候,这个指针可以修改它所指向的值,但是只能指向初始化时设置的地址。   3、在创建指针时还可以使用两次const,表示该指针既不能修改它所指向的地址,也不能修改它所指向地址上的值   清单: int a[10];   const double b[10];   const double *p=a; //有效   p=b; //有效   p=&a[3]; //有效   ---------------------------   int a[10];   const double b[10];   //只能将非const数据的地址赋给普通指针 (否则,通过指针就能修改const数组中的值了)   double *p=a //有效   p=b; //无效*   p=&a[3]; //有效   ---------------------------   void sum(const double *a,int n);   //此函数可以接受普通数组和const数组名作为参数,因为这两种参数都可以用来初始化指向const的指针   int a[10];   const double b[10];   sum(a,5);//合法   sum(b,4);//合法   ---------------------------   int a[10];   double *const p=a; //p指向数组的开始   p=&a[0]; //不允许,因为该指针不能指向别处   *p=9.9; //可以做,更改a[0]的值   ---------------------------   int a[10];   const double *const p=a;   p=&a[0]; //不允许   *p=9.9; //不允许   块   块指的是一块数据,是个抽象的概念,和C语言没有关系,这种抽象的东西,别说其他语言也能用,就是日常生活中也会把东西分块管理,C语言中没有对块进行定义,因为这只是个抽象的概念,块可以是内存块,数据块,程序块,哪怕是豆腐块也能是块... 意思就是在管理中被划分为一类的一个基本单位   存储期:   存储期这也是变量的特点,它称为生存期,表示变量在内存中存在的时间的长短。   1、静态存储期:在程序编译时就分配内存空间并保持不变,程序执行结束后才释放。   2、线程存储期:thread_local,其声明后会给每个线程分配一个单独的私有备份   3、自动存储期:局部变量通常都自动为auto 存储期   4、动态存储期:就是用new 或者malloc分配的内存,如果不主动释放,在整个程序都占有内存   作用域:   这个是表示变量在哪些范围内起作用,由链接点决定。   1、块作用域:用{}括起来的,从声明开始到"}" 结束   2、函数作用域:goto(标识符) 的作用域为整个函数。   3、函数原型作用域:函数声明开始,函数声明结束而结束   4、文件作用域:整个文件或者程序   链接属性: 表示变量能在哪些范围内使用.   1、内部链接 :只能在源文件内部使用.   2、外部链接 : 能在源文件内部和外部文件中使用.   3、空连接 : 只能在代码块内(函数内部)使用.   限定符 :   volatile:   const:   restrict:   _Atomic:   作者:Mr_Li_   另外的话 为了帮助大家,轻松,高效学习C语言/C++,我给大家分享我收集的资源,从最零基础开始的教程到C语言项目案例, 帮助大家在学习C语言的道路上披荆斩棘!可以来我粉丝群领取哦~   编程学习书籍分享:   编程学习视频分享:   整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程) 最重要的是你可以在群里面交流提问编程问题哦!   对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】 一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

50,两连胜,国青的命运还不在自己手中极目新闻记者徐平北京时间9月15日凌晨,在U20男足亚洲杯预选赛中,中国队以50战胜马尔代夫队,取得两连胜。不过他们想要晋级,还有待与沙特队最后一战的结果而定。图片来源中国足球队的26分16板10助攻,一战打服东契奇!25岁的他,有能力进入NBA吗?欧锦赛四分之一决赛,波兰男篮爆冷击败了斯洛文尼亚,晋级四强。这场比赛之前,更多人看好的是斯洛文尼亚,而非波兰男篮。毕竟前者是世界排名第五的球队,后者只排在第十三位。而且斯洛文尼亚有跳水女皇伏明霞的上位史,她的故事远比你想象得更精彩1985年,年仅7岁的伏明霞,因为优越的身形条件被老师选中进入跳水行业,从此开始了长达15年的跳水运动员生涯。在这一年,郭晶晶刚满4岁,距离她参加跳水训练还有4年。在这一年,33岁中国队全力备战!没有徐嘉余,场外风波未平王冰冰消失至今虽然原定于今年9月份举办的杭州亚运会延期,但对于中国游泳队来说,还有一项非常重要的赛事,那就是12月13日至18日在澳大利亚墨尔本举行国际泳联短池游泳世锦赛,这也是2022年中国游国乒爆出冷门,1天内11人接连淘汰,遭遇一轮游,刘国梁看清形势众所周知,最近成都世乒赛马上要开始,国乒已经官宣十人的参赛名单,最近他们正在国内进行备战,期待能够在家门口拿到两个项目的冠军。与此同时值得注意的是,就在近期国乒派出另外一部分年轻的乒坛再爆冷门!世界冠军首轮出局,国乒全天4胜6负,两项仅剩独苗2022年9月15日,乒乓球WTT哈萨克斯坦赛继续进行,国乒结束双打首轮的角逐,混双徐海东吴洋晨淘汰韦策尔斯科尔茨,陈垣宇陈熠不敌林昀儒陈思羽,男双徐海东梁俨苧,女双徐奕范姝涵臧小中超最新排名!三镇12连胜终结,泰山绝处逢生,国安反超海港中超联赛继续进行,本轮武汉三镇和山东泰山上演巅峰对决,最终双方战成11平,三镇的12连胜被终结,无缘追平山东保持的13连胜纪录。山东泰山落后的情况下追平,主场绝处逢生。北京国安击败恭喜31岁刘诗雯走马上任,新身份正式出炉,球迷祝贺众所周知,近期中国队正在成都备战世乒赛,主要是期待能够在家门口取得更好的成绩。前段时间,刘诗雯已经奔赴成都,同样参加这一次的集训,虽然这一次参加比赛的球员名单并没有出现刘诗雯,但这欧冠多场冷门,三支豪门取得首胜,切尔西尤文要降级陪曼联?欧冠小组赛的第二轮全部结束,AC米兰国际米兰和利物浦三支豪门球队,都取得欧冠首胜,避免早早落入小组不利的位置。本轮也有多场冷门的结果,尤文图斯主场不敌本菲卡,把自己逼入绝境,来自英外网扫盘丨欧罗巴谢里夫VS曼联附比分伤停相信曼城的比赛不少人都有看,果真也是如我所料多特并没有大家想的那么不堪一击,我认为抛开其他因素,单单就比赛来看,这是多特近段时间最好的一次防守了,贝林能攻能守,组织推进拦截样样出色后卫合影梅西后向女伴炫耀他让我心动娇妻晒照我哪点比梅西差尽管欧冠客场13输给大巴黎,但海法马卡比的球员并不沮丧,反而因为与梅西姆巴佩和内马尔等天皇巨星同场竞技,而感到无比开心。在此之前,这群无名小卒做梦都没想到,竟然有一天他们能够与偶像下周三油价降价已成定局,第七次降价要来了,9月16日2022年国内成品油零售价第18轮调整将在9月21日24点(下周三晚)启动,原油价格反转下跌近4按今天第7个工作日数据预测为油价降价且降价已成定局,当前原油变化率6。41,国内汽柴翻版邓文迪华裔灰姑娘嫁给谷歌创始人,结婚3年就闹离婚01hr今年1月,谷歌联合创始人世界第六大富豪谢尔盖布林申请与华裔妻子妮可沙纳汉离婚,理由是两人之间有着不可调和的分歧。他们结婚三年,并且育有一女。布林主张离婚后双方共享年仅三岁的人民币破7,释放什么经济信号?文章作者北风雪林今天,人民币汇率时隔两年多,再次跌破整数7关口。对于绝大多数国人来说,人民币汇率整数关口,并不是一个经济数据,更像是一个信心数据。毕竟2020年的汇率快速跌破7,是离岸人民币跌破7元!券商带头砸盘!为什么股市下跌这么惨?离岸人民币跌破7元,股市也一片惨淡,人民币下跌对我们有什么影响?后续又该怎么办?对我们老百姓来说,人民币贬值是不是意味着钱变得更加不值钱了。很多网友会说我们不懂汇率,也不知道会有什人民币再次破7!保房价,还是保汇率?文凯风小孩子才做选择,成年人全都要。01hr7,有多重要?人民币汇率再次破7。9月16日,离岸人民币与在岸人民币双双跌破整数关口7。这是继2019年8月和2020年7月之后,第三次人民币汇率破7,是出啥大事了吗?如何打赢第四次汇率保卫战人民币汇率破7,是出啥大事了吗?其实最近两天的美元走势并不是太强,欧元,日元,包括美元指数本身,相对都比较平稳,没什么太大的波动。但是离岸人民币汇率,突然快速贬值,率先突破了7这个破7后,红线在哪里,人民币如何应对这一次美元大围剿?终于来了,离岸人民币汇率昨天踏破7的关口,并且今天仍在延续跌势,目前最低为7。0351,按照之前破7的走势,可能会加速跌下去然后止步,再也无法冲下去。上两次破7分别是2019和20人民币汇率破7,影响多大?上市公司汇兑损益逆转,多管齐下稳经营时隔两年多,离岸人民币汇率再度破7引发市场关注。9月15日,离岸人民币对美元汇率跌破7。0整数关口,日内最低贬值至7。0183,此后有所反弹,截至证券时报e公司记者发稿,离岸人民币最高级的养生,不是锻炼,不是睡觉,就一个字!晚课第1349期一位作家曾说过记性太好,有时是一种负担,容易忘记往事的人,是幸福的。人这一生最大的烦恼,就是记性太好,总是忘不掉,舍不下,反倒增添负累。真正的聪明人,都懂得善忘。忘,不是失忆,而是同富说先富带后富,怎么就成了伪命题?(生活随笔)有个将死的人对儿子说一定要去赚钱,能诚实地赚钱就赚诚实的钱不能的话,也要赚钱,无论如何就是要赚钱。致富重要,但手段更重要。富裕可作为目标和动力,但没有品质的富裕难可持续。这个建议禁适合发朋友圈的走心文案,你喜欢哪一句?1最好的感觉,是有人懂你的欲言又止。2在逆境中要看到生活的美,在希望中别忘记不断奋斗。3心若大了,事情就小了。4愿你成为这样的人外表平静如水,内心坚定如山。5愿你是藏在冰里的火,希
科尔我的球员们都很疲惫,但是步行者也处于四天三赛中今日,NBA常规赛勇士104112不敌步行者。赛后,勇士主教练史蒂夫科尔接受了采访。我的队员们都很疲惫,但是这是NBA的一部分,步行者他们也处于四天三赛中,每支球队都会经历这样的赛恭喜杜锋,恭喜杨鸣,CBA主客场制迎突破进展,球迷叫好感谢姚明最近CBA的全明星赛已经结束,接下来第二阶段的比赛即将拉开帷幕,对于很多球迷来说期待已久的比赛终于到来。唯一比较可惜的事情,可能就是第二阶段没有像此前说好的那样恢复主客场制,这次依C罗再遇危机!七成葡萄牙球迷反对他首发,场上一动作被主帅批评北京时间12月7日凌晨,卡塔尔世界杯最后一场18决赛即将打响,对阵双方是葡萄牙队和瑞士队。葡萄牙队在小组赛最后一轮12负于韩国队,但仍以小组第一的身份晋级淘汰赛。在那场比赛中,葡萄轰31812!22岁菜鸟爆冷勇士,刷爆纪录扎心库里,詹皇也曾吃瘪北京时间12月6日,步行者客场112比104爆冷击败阵容齐整的勇士。步行者二轮秀菜鸟内姆哈德再次大爆发,轰下31分8篮板12助攻准三双,在比赛中他将勇士核心库里比了下去,关键时刻在中国CBA新星廖三宁一位真正的勇士,在场上全力去拼人的成长,机遇都来自于自己的表现,一旦表现良好,就会被伯乐相中。而专业的系统科学的训练,一定会令自己在职场中少走弯路,而不论从事什么领域的行业,都要打好基础,找对老师很重要。同时,勇士参与三方交易讨论,交易报价骑士中锋阿伦据美媒报道的消息,勇士骑士步行者三支球队一笔三方6人的交易方案,如果谈判顺利,怀斯曼将加盟步行者,贾莱特阿伦将辅佐库里,骑士得到特纳。具体交易方案为勇士送出怀斯曼库明加罗林斯202NBA赛事回顾凯尔特人116110猛龙NBA赛事在线关注857专栏12月6日讯观看NBA常规赛857直播i免费观看入口httpzb。laiqw。cnm?fromanlan8(长按打开链接即可直达页面)比赛时间北京时间12月6日凯尔特人1国服最新星GD没实力?Cay妖刀姬1V5逆风翻盘,17JL内奸无尘立功今天进行的永劫无间世界冠军赛三排小组赛第二日的比赛中,越南赛区的BBE战队首次亮相给观众留下了深刻的印象,而多次倒在他们手上的国内队伍GD似乎成了背景板。但是在第四局比赛中,GD这哈里凯恩裘德贝林厄姆为英格兰队展现出超级巨星般的沉着卡塔尔世界杯淘汰赛第二天赛程,青少年巨星裘德贝林厄姆证明了谁才是本届世界杯中最好的中场之一,哈里凯恩(HarryKane)将英格兰带入四分之一决赛对阵法国的对决。在英格兰队以30战阿斯皮利奎塔我们必须在淘汰赛展现实力,踢好对摩洛哥的比赛直播吧12月5日讯西班牙后卫阿斯皮利奎塔接受塞尔电台的采访,谈到了对阵摩洛哥的世界杯18决赛,以及西班牙队成功的原因。西班牙将在世界杯18决赛中对阵摩洛哥现在是精彩的淘汰赛阶段,我卡塔尔世界杯克罗地亚队点球大战击败日本队晋级八强新华社多哈12月5日电(记者张泽伟刘旸郑昕)日本队距离创造历史仅差一步!在5日的卡塔尔世界杯18决赛中,他们与欧洲劲旅克罗地亚队战至最后的点球大战,最终以24(120分钟11)败北