1

構造体のインスタンスに含まれる配列を印刷しようとすると、結果の一部が期待どおりになり、他の部分は意味不明に見えます。ここで何が起こっているのですか?

出力例:

$./makevector テスト

名前: テスト 16481592918288327671592918096327670000000000100011809530144490000159291832032767

私のコードは次のとおりです。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

static int vec_length = 30;

typedef struct {
  char* name;
  int* vector;
} word_entry;

static word_entry entry_one = {NULL,NULL}; 

void MakeEntry(char* word, word_entry* entry){
 entry->name = word;
 int i;
 int this_vector[vec_length];
 srand(time(NULL));
 for(i=0;i<vec_length;i++){
   this_vector[i] = rand()%2;
 } 
entry->vector = this_vector;
}

int main(int argc, char* argv[]){
  int i;
  MakeEntry(argv[1], &entry_one);
  printf("NAME: %s\n", entry_one.name); 
  for (i=0;i<vec_length;i++){
    printf("%d",entry_one.vector[i]);
  }
  printf("\n");
}
4

6 に答える 6

3

this_vectorへのローカル配列MakeEntry()です。その関数が終了すると、その配列は範囲外になります。無効entry->vectorなものを指していると、未定義の動作が発生します。

于 2012-04-30T16:24:05.880 に答える
2

ここで複数の問題 - 「this_vector」は MakeEntry に対してローカルであり、MakeEntry が戻ると範囲外になります。

また-printfsに\nが必要だと思います

最後に - どのような出力を期待していましたか?

于 2012-04-30T16:23:56.407 に答える
2

これらの行に沿って何かを試してください:

void MakeEntry(char* word, word_entry* entry)
{

      int i = 0;
      int *this_vector = calloc(vec_length+1, sizeof(int)); //Allocate an array of             Nelements x sizeof(int)

      entry->name = word;

      srand(time(NULL));

     for(i = 0; i < vec_length; i++)
       this_vector[i] = rand()%2;

      entry->vector = this_vector;
}
于 2012-04-30T18:27:47.220 に答える
1

スタック上に作成this_vectorします。ただし、関数の外で使用するために、に割り当てます。entry->vectorMakeEntry

MakeEntry返されると、this_vector有効ではなくなり、ガベージのソースになる可能性があります。

void MakeEntry(char* word, word_entry* entry){
    int this_vector[vec_length];
    [...]
    entry->vector = this_vector;
}
于 2012-04-30T16:25:10.230 に答える
0

私の意見では、問題はスペースなしで数字を印刷していることです。試してみてください

printf("%d ",entry_one.vector[i]);

配列内のすべての単一の int を識別できるようにします。

まあ、chrisaycockのvector答えを読んでください。スタックに割り当てられた変数から全体を割り当てていることに気づきませんでした。ローカル スコープの後にスコープ外になるため、動的に割り当てる必要があります。

entry->vector = calloc(vec_length,sizeof(int));
for(i=0;i<vec_length;i++){
  entry->vector[i] = rand()%2;
} 
于 2012-04-30T16:21:38.903 に答える
0
entry->vector = this_vector;

this_vectorはローカル配列型の変数であり、関数が戻るとすぐに失われます。しかし、それでも構造体メンバーはそれへの参照を保持しています。

配列をスタックに割り当てる代わりに、mallocまたはその他の動的メモリ割り当て子を使用します。free不要になったら思い出してください。

于 2012-04-30T16:24:06.780 に答える