请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,关于realloc函数

在一次错误中,realloc函数大小我写成了language_capacity,而不是sizeof(Language)*language_capacity,结果依然打印了出来。我很好奇,于是我就调试,发现realloc函数把之前的数据修改了,我想问的是,明明把之前的数据修改或者覆盖了,为什么还能打印出来?

https://img1.sycdn.imooc.com//szimg/5fe2a48a09811dad09020494.jpg

这张图是执行Language *languages=malloc(sizeof(Language)*language_capacity);这段代码的内存分布

https://img1.sycdn.imooc.com//szimg/5fe2a4fe09c1ed7809070484.jpg

这张图是在执行realloc函数前的内存分布,已经赋了三次值(前三行)。

https://img1.sycdn.imooc.com//szimg/5fe2a5a909d5462b09050513.jpg

这张图是在执行realloc函数之后的内存分布,可以看到数据被修改了(紫色部分)

我就好奇为什么还能打印出C这个字母,因为C的地址已经被修改了呀(第一行的第7,8个字节)

另外,调试的时候我没有打印出C这个字母,因为一打印,就崩了。正常运行就能打印出。

代码:

#include <stdio.h>
#include <io_utils.h>
#include <stdlib.h>
#include <string.h>
int main(){
  char string[] = "C, 1972; C++, 1983; Java, 1995; Rust, 2010; Kotlin, 2011";
  typedef struct {
    char *name;
    int year;
  } Language;
  const char* language_break=";";
  const char* field_break=",";
  int language_capacity=3;
  int language_size=0;
  Language *languages=malloc(sizeof(Language)*language_capacity);
  if(!languages){
    abort();
  }
  char* next=strtok(string,field_break);
  while(next){
    Language language;
    language.name=next;
    next=strtok(NULL,language_break);
    if(next){
      language.year=atoi(next);
    }
    if(language_size+1>language_capacity){
      language_capacity*=2;
      languages=realloc(languages,language_capacity);
      if(!languages)
        abort();
    }
    languages[language_size++]=language;

    next=strtok(NULL,field_break);
  }
  PRINTLNF("%s",languages[0].name);//打印C这个字母
  free(languages);
  return 0;
}


正在回答 回答被采纳积分+3

1回答

bennyhuo 2020-12-23 10:40:41

恰好name的位置没改吧,你仔细看看,前面有几个字节的值没变

0 回复 有任何疑惑可以回复我~
  • 提问者 张婧仪 #1
    year也可以打印出来,year已经都完全被替换成abab了,还可以打印出1972
    回复 有任何疑惑可以回复我~ 2020-12-23 12:09:30
  • bennyhuo 回复 提问者 张婧仪 #2
    补充一下完整的源码
    回复 有任何疑惑可以回复我~ 2020-12-23 14:22:03
  • 提问者 张婧仪 回复 bennyhuo #3
    #include <stdio.h>
    #include <io_utils.h>
    #include <stdlib.h>
    #include <string.h>
    int main(){
      char string[] = "C, 1972; C++, 1983; Java, 1995; Rust, 2010; Kotlin, 2011";
      typedef struct {
        char *name;
        int year;
      } Language;
      const char* language_break=";";
      const char* field_break=",";
      int language_capacity=3;
      int language_size=0;
      Language *languages=malloc(sizeof(Language)*language_capacity);
      if(!languages){
        abort();
      }
      char* next=strtok(string,field_break);
      while(next){
        Language language;
        language.name=next;
        next=strtok(NULL,language_break);
        if(next){
          language.year=atoi(next);
        }
        if(language_size+1>language_capacity){
          language_capacity*=2;
          languages=realloc(languages,language_capacity);
          if(!languages)
            abort();
        }
        languages[language_size++]=language;
    
        next=strtok(NULL,field_break);
      }
      PRINTLNF("%s  %d",languages[0].name,languages[0].year);
      free(languages);
      return 0;
    }
    回复 有任何疑惑可以回复我~ 2020-12-23 18:13:02
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号