こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

memsetについて

memsetについて
int p[5]={2,3,4,5,7}の配列でp[2]を削除してp[5]={2,3,5,7,}にしたいです。
memsetを使ったらいいよと教わったのですが、いまいち使い方がわかりません↓どなたかわかる方お願いします。環境はCです。

投稿日時 - 2010-06-16 12:48:08

QNo.5972491

すぐに回答ほしいです

質問者が選んだベストアンサー

あえて言うなら memset  ではなくて #1さんが書かれてる memmove ではないでしょうか

int p[5]={2,3,4,5,7};
memmove(&p[2], &p[3], sizeof(int) * 2);  // ここで終わるとp[4]には7が残る
p[4] = 0; // もしくは memset(&p[4], 0, sizeof(int));

※ memmoveは大丈夫だと思ったけど転送元と転送先アドレスが同じだったりすると
  問題になることがあるので注意してください

投稿日時 - 2010-06-16 13:17:58

ANo.3

このQ&Aは役に立ちましたか?

23人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(5)

ANo.5

「intは、コンパイル環境や、OSによって違うサイズになる」というと「int 以外はコンパイル環境や OS によらず同じサイズ」のように読めますけど, 実際には「char 系以外は全部違うと思うべき」ですよね>#2. 厳密にいうと char も「1バイト」であることしか言えないわけだけど.
で, 「サイズが違う」ことを前提にプログラムを組めば, 少なくともソースレベルでの互換性は取れる.

投稿日時 - 2010-06-18 12:56:03

-広告-

ANo.4

memmoveでしょうね。
ちなみに、memmoveは転送元と転送先の領域が重なっていても問題なく動作することが保証されています。
重なっているとダメなのはmemcpyですね。

投稿日時 - 2010-06-16 14:27:07

ANo.2

この場合は、あんまり安易にmemset使うべきでは有りません。
intは、コンパイル環境や、OSによって違うサイズになるのはご存じですか?

memset使ってしまうと、移植性は落ちますよね。

普通はループ文を回して
for(i=2;i<5;i++){
/* 2,3,4まで3,4,5の値をコピー */
p[i] = p[i+1];
}
/* 最後のp[5]に0をセット */
p[i] = 0;

とかって詰めて行けば良いと思いますけど。

投稿日時 - 2010-06-16 13:02:10

ANo.1

うう~ん, p[2] を「削除」するという意味が分かりかねるなぁ.... 「削除」した跡地をどうするんだろう.
memmove?

投稿日時 - 2010-06-16 12:58:58

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-