1

reallocを使用してより大きなメモリアドレス空間の先頭への新しいポインタを取得することに関する他のSOの質問を読みましたが、何が間違っているのか理解できません。バックトレースとメモリダンプを出力します。後でstrhldrにアクセスしようとしましたが、それほど遠くまでは行かないと思います。

char *strhldr = (char *)malloc(strsize);

 int chrctr = 0;
 if(chrctr == strsize - 3){ // when you get close
  strsize = strsize*2; //double size
  char *temp = realloc(strhldr, strsize); //make more room
    if(temp == NULL)
     printf("reallocate failed\n");
    else{
     strhldr = temp;
     free(temp); // removed same issue
    }
} 

// Later attempt to add it to an array
cmdargs[i] =  strhldr;

これはすべて、chrctrとstrsizeがインクリメントされるwhileループ内にあります

完全なコード

  int argctr = 64;
  char **cmdargs = (char **) malloc(argctr * sizeof(char*));
  char c = getchar();
  int i = 0;


  while(c != '\n' && c != EOF){ //read through a String of stdin
  int strsize = 32;
  char *strhldr = (char *)malloc(strsize);
  char *strstarthldr = strhldr;


    if(c == ' ')
      c = getchar();
    while(c != ' ' && c != '\n' && c != EOF){

      int chrctr = 0;
     if(chrctr == strsize - 3){ // when you get close
      strsize = strsize*2; //double size
      char *temp = realloc(strhldr, strsize); //make more room
        if(temp == NULL)
         printf("reallocate failed\n");
        else
         strhldr = temp;

    }      //add that word to the array of strings
      strhldr[chrctr] = c;
      chrctr++;
      c = getchar();

    }
    strhldr[charctr] = '\0';
    //strhldr = strstarthldr;
    cmdargs[i] =  strhldr;
    i++;
  }
4

3 に答える 3

4

成功すると、reallocは必要に応じて引数を解放します。したがって、free(temp)の呼び出しを削除します。

于 2013-01-26T18:22:26.577 に答える
1

あなたが何をしようとしているのかは私にはあまり明確ではありませんが、strhldrfree(temp);が無効になり、それへの将来の読み取り/書き込みアクセスが問題を引き起こすと思います。

于 2013-01-26T18:33:51.560 に答える
0

2番目の問題-値charctr(chrctrではない)が設定されていません。これがループのバージョンです。私はそれをテストしていませんが、近いはずです。

  if(c == ' ') {
      c = getchar();
  }

  int chrctr = 0;
  while(c != ' ' && c != '\n' && c != EOF){
     if(chrctr == strsize - 3){ // when you get close
        strsize = strsize*2; //double size
        char *temp = realloc(strhldr, strsize); //make more room
        if(temp == NULL) {
           printf("reallocate failed\n");
           break;
        }
        else {
           strhldr = temp;
        }
     } 
     strhldr[chrctr] = c;
     chrctr++;
     c = getchar();
  }
  strhldr[chrctr] = 0;
于 2013-01-26T18:42:36.880 に答える