从结构中打印数组

时间:2012-04-30 16:19:43

标签: c arrays struct printf

当我尝试打印包含在结构部分实例中的数组时,结果是我所期待的,其他部分似乎是胡言乱语。这是怎么回事?

示例输出:

  

$。/ makevector test

     

姓名:test 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");
}

6 个答案:

答案 0 :(得分:3)

this_vectorMakeEntry()的本地数组。当该函数结束时,该数组超出范围。所以entry->vector指向无效的东西,你会得到未定义的行为。

答案 1 :(得分:2)

此处有多个问题 - “this_vector”是MakeEntry的本地问题,并且在MakeEntry返回时超出范围。

另外 - 我认为你想在你的printfs中找到一些\ n

最后 - 你期待什么输出?

答案 2 :(得分: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;
}

答案 3 :(得分:1)

您在堆栈上创建this_vector。但是然后将其分配给entry->vector,以便在函数MakeEntry之外使用。

MakeEntry返回后,this_vector不再有效,可能是您垃圾的来源。

void MakeEntry(char* word, word_entry* entry){
    int this_vector[vec_length];
    [...]
    entry->vector = this_vector;
}

答案 4 :(得分:0)

在我看来,问题是您正在打印没有任何间距的数字,请尝试

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

这样您就可以识别阵列中的所有单个整数。

哦,好了,读了 chrisaycock 回答,我没注意到你从堆栈分配的变量分配中分配了整个vector。它超出了本地范围之后的范围,你应该动态分配它:

entry->vector = calloc(vec_length,sizeof(int));
for(i=0;i<vec_length;i++){
  entry->vector[i] = rand()%2;
} 

答案 5 :(得分:0)

entry->vector = this_vector;

this_vector是一个本地数组类型变量,一旦函数返回就会丢失。但结构成员仍然会引用它。

不使用堆栈分配数组,而是使用malloc或任何其他动态内存分配器。当不再需要时,请记住free