• 締切済み

書き換え

「startで示されるアドレスからlengthバイト分だけの領域に関して、値valで埋める関数cmemset(char *start,char value,int length)を作成し、malloc()を使ってメモリ領域を確保し、cmemset()が動作することを確認(メモリ領域の内容を整数値として表示)するプログラム」↓ #include <stdio.h> #include <stdlib.h> // char 型エリア対応のmemset関数 // length バイト分の連続エリアを初期化する char* cmemset(char *start,char value,int length){ __char__*p; __p_=_start; __while_(length_>_0)_{ ____*p++_=_start; ____length_-=_1; __} __return_start; } int_main(){ __char__x[9]; __char__*z; __char__ini=0x7f; __int___k; __//_静的配列 __printf("cmemset(x,'0',9);\n"); __cmemset(x,'0',9); __printf("x[9]="); __for(k=0;k<9;k++)_printf("%3d",x[k]); __printf(":_by_%%3d\n"); __//_動的配列 __z_=_(char*)malloc(9); __printf("cmemset(z,'0',9);\n"); __cmemset(z,'0',9); __printf("z[9]="); __for(k=0;k<9;k++)_printf("%3x",z[k]); __printf(":_by_%%3x\n"); __return_0; } /* 出力: cmemset(x,'0',9); x[9]= 48 48 48 48 48 48 48 48 48: by %3d cmemset(z,'0',9); z[9]= 30 30 30 30 30 30 30 30 30: by %3x */ を「srcで示されるアドレスからlengthバイト分だけの領域を、destで示される領域へコピーする関数cmemmove(char *dest, char *src, int length)を作り、malloc()を使ってメモリ領域を確保し, smemmove()が正確に動作することを確認(メモリ領域の内容を整数値として表示)するプログラム」に書き換えたいのですが、 違っているのは、オーバーラップしていても動作するようにする部分で、オーバーラップでの正常動作を全ての場合で保障する方法は、一度テンポラリ領域を設けてそこにデータを退避してから、退避エリア>dstへのコピーという二段階の処理が必要だということはなんとなくわかるのですが、どう書けばいいのかわかりません。どなたか助けて下さい。

みんなの回答

  • mozura
  • ベストアンサー率100% (1/1)
回答No.3

メモリが重なっている場合のヒントです char *dest, char *src; char cpTest[10] = "abscedghi" //例A///////////////////////////////// *dest = &cpTest[0]; *src= &cpTest[2] length = 3; //例B///////////////////////////////// *dest = &cpTest[2]: *src = &cpTest[0]; length = 3; 例A、例Bのような場合があるわけです 前の方が書いていたように 例Aの場合*src から*destに1文字づつコピーすれば破壊されません cpTest[0]= cpTest[2]; cpTest[1]= cpTest[3]; cpTest[2]= cpTest[4]; 例Bの場合、後ろからコピーすれば破壊されません cpTest[4]= cpTest[2]; cpTest[3]= cpTest[1]; cpTest[2]= cpTest[1]; あとはif文を使えってA,B両方対応するように書けば退避エリアを使わずにすっきりと仕上がります

nadonado
質問者

お礼

参考にさせていただきました。ありがとうございました。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

>一度テンポラリ領域を設けてそこにデータを退避して たとえば、 アドレス01234567890 転送先:__あいうえ_____ 転送先:____あいうえ___       ↑src         ↑dst の場合、アドレス2から5の順に転送するとメモリが破壊されますが、 アドレス5から2を、アドレス7から4へ逆順に転送すれば、メモリは破壊されません。 そんなふうに場合分けすれば、テンポラリは不要かと。

nadonado
質問者

お礼

なんとかできました。ありがとうございました。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

cmemset関数の第2引数valueを使っていないように見えます。 それでよいのでしょうか。

関連するQ&A

専門家に質問してみよう