繁体   English   中英

从结构打印数组

[英]Printing an array from a struct

当我尝试打印包含在struct实例中的数组时,结果是我所期望的,而其他部分似乎很乱。 这里发生了什么?

输出示例:

$。/ 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");
}

this_vectorMakeEntry()的本地数组。 该函数结束时,该数组超出范围。 因此, entry->vector指向无效对象,您将获得未定义的行为。

这里存在多个问题-“ this_vector”是MakeEntry的本地变量,并且在MakeEntry返回时超出范围。

另外-我认为您在printfs中需要一些\\ n

最后-您期望什么输出?

尝试以下方法:

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;
}

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

一旦MakeEntry返回, this_vector将不再有效,并且很可能是垃圾的来源。

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

我认为问题在于您要打印的数字没有任何间距,请尝试使用

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;
} 
entry->vector = this_vector;

this_vector是局部数组类型的变量,函数返回后立即丢失。 但是结构成员仍然引用它。

与其在堆栈上分配数组,不如使用malloc或任何其他动态内存分配器。 请记住在不再需要时free它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM