0

Cの関数に問題がありopendirます。コードは次のとおりです。

の宣言rvm

rvm_t func()
{
   rvmBlock=(rvm_t)malloc(sizeof(rvm_t));
   return rvmBlock;
}

rvm_t rvm;
rvm=func();

printf("rvm->backingStore=%s\n", rvm->backingStore); 
if( (dir = opendir(rvm->backingStore)) !=NULL )
{
   printf("rvm->backingStore inside if=%s\n", rvm->backingStore);
}

私がこれに対して得ている出力は次のとおりです。

rvm->backingStore=rvm_segments/
rvm->backingStore inside if=rvm_segments!? 

"!?"何らかの理由で表示されているいくつかのゴミ文字です。

誰かが何が悪いのか説明できますか?

rvmの構造は次のとおりです。

struct rvm_info
{

   char backingStore[20];
   struct memSeg * memSegs[20];
   long int storage_size;
   int memSeg_count;
   FILE * log_fd;
};

typedef struct rvm_info* rvm_t;
4

1 に答える 1

2

これがあなたの問題です:

rvm_t func()
{
   rvmBlock=(rvm_t)malloc(sizeof(rvm_t));
   return rvmBlock;
}

rvm_tはへのポインタとして定義されているstruct rvm_infoため、誤ったサイズをに渡していますmallocsizeof(rvm_t)ポインタのサイズ(通常は4または8バイト)に相当し、aのサイズ(4または8バイトをはるかにstruct rvm_info超える)ではありません。struct rvm_infoサイズは、ポインターではなく、のサイズにする必要があります。その呼び出しを次のように変更します。

rvmBlock = malloc( sizeof(*rvmBlock) );

つまり、次のことを意味します。

rvmBlock = malloc( sizeof(struct rvm_info) );

そうしないと、全体に十分なメモリが割り当てられていないため、未定義の動作が発生しますstruct rvm_info。したがって、に割り当てられていないメモリの一部にその文字列を格納することにrvmなり、プログラムの他の部分がそのメモリを割り当てる可能性があります。

ヒープ上のメモリを変更するための呼び出しはopendir、特に引数がタイプであるため、渡された文字列を直接/意図的に変更することはありませんconst char*

編集:キースがコメントで述べたように、C( C ++ではなく)を使用する場合、の結果をキャストするのは悪いと見なすことができますmallocこの質問には、このトピックに関する議論があります。

于 2011-12-07T03:31:24.423 に答える