当我尝试打印包含在结构部分实例中的数组时,结果是我所期待的,其他部分似乎是胡言乱语。这是怎么回事?
示例输出:
$。/ 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");
}
答案 0 :(得分:3)
this_vector
是MakeEntry()
的本地数组。当该函数结束时,该数组超出范围。所以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
。