[英]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_vector
是MakeEntry()
的本地数组。 该函数结束时,该数组超出范围。 因此, 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.