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->vector,以供函数外使用MakeEntry

一旦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]);

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

哦,好吧,阅读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 回答