条件跳转或移动取决于未初始化的值,结构

时间:2017-02-26 14:18:17

标签: c valgrind

我有一个指向结构的指针数组,我正在尝试循环使用。我对如何完全初始化它并不完全有信心,但我一直这样做:

Entry *newEntry = malloc(sizeof(Entry));

我有另一个函数,它是测试代码,如果数组中的点有一个填充值或者为null,那么它将通过数组

Entry* current = hashTable->table[val];

    while(current != NULL){

我只使用Entry * current作为一个临时变量来引用存储在数组中的内容。这样做时我得到一个valgrind错误:  条件跳转或移动取决于未初始化的值

我必须以某种方式初衷吗?我想要做的就是存储对数组中那个点的引用..这可能是也可能不是null并且如果它不是NULL则执行while循环

他们应该初始化吗?

修改 - 我有一个每个这些Entry结构的指针数组,我使用这个代码初始化。我希望这是正确的方法。

Entry** arrayOfPointers;
    arrayOfPointers = malloc(arraySize* sizeof(Entry*));

EDIT2 - 如果上面的Aplogies不是我认为的最小。这是一个最小的例子

//create arry of pointers
        Entry** arrayOfPointers;
        arrayOfPointers = malloc(arraySize* sizeof(Entry*));

//create elements at certain indexs in array
        Entry *newEntry = malloc(sizeof(Entry));
        arrayOfPointers[1] = newEntry;
//this is the gist of what this does

//Search and do something when found something in array
//since the array is pretty big, theres going to be indexes when theres nothing
for(int i = 0; i < arraySize; i++){
  //temp holder
  Entry *temp = arrayOfPointers[i];
  if(temp != NULL){
   //Do Stuff
   //This if statement is where the conditional jump or move error will be thrown
//not exactly sure what but somehow do not initialize temp correctly
 }
}

2 个答案:

答案 0 :(得分:0)

malloc 可能会失败。因此你需要测试它。

Entry *newEntry = malloc(sizeof(Entry));
if (newEntry != NULL)
{
    /* Use it */
    free(newEntry);
}
else
{
    printf("error - malloc failed\n");
}

该代码仅为一个条目分配空间。 我怀疑你打算成为一个数组

int elementCount = 1000;
Entry *newEntry = malloc(sizeof(Entry) * elementCount);

获得动态分配条目的数组后,需要初始化数组中的值

for (int z=0; z < elementCount; z++)
{
    newEntry[z] = {whatever value is needed to do the initialization};
}

然后你可以开始散列并返回散列元素的地址,并用它做一些事情。

答案 1 :(得分:0)

嗯,你的MCVE-ish代码片段实际上解释了为什么会出现这个错误。我们假设arraySize是3.并且假设所有调用都成功,让我们绘制程序内存布局的样子:

Entry** arrayOfPointers = malloc(arraySize* sizeof(Entry*));

有了这个,我们得到以下结果:

arrayOfPointers ------+
                      ↓
                  +-------+
                  |???????|
                  +-------+
                  |???????|
                  +-------+
                  |???????|
                  +-------+

然后用这个初始化第二个条目:

Entry *newEntry = malloc(sizeof(Entry));
arrayOfPointers[1] = newEntry;

所以你得到以下内容:

arrayOfPointers ------+
                      ↓
                  +-------+
                  |???????|
                  +-------+      +-------+
                  |       |----->|       |
                  +-------+      +-------+
                  |???????|          ^
                  +-------+          |
                                     |
newEntry ----------------------------+

所以你可以想象当你迭代arrayOfPointers所指向的块中的所有指针时,使用以下代码:

for(int i = 0; i < arraySize; i++){
  Entry *temp = arrayOfPointers[i];
  if(temp != NULL){
  }
}

您将一堆不确定的地址(上面标有???????)复制到temp,然后继续将其与NULL进行比较。

Valgrind抱怨是对的。你没有在这些指针中写入NULL。它们是未初始化的,你会像对待它们一样对待它们。您必须首先迭代arrayOfPointers指向的内存并初始化它:

Entry** arrayOfPointers = malloc(sizeof(*arrayOfPointers) * arraySize);
for(int i = 0; i < arraySize; ++i){
  arrayOfPointers[i] = NULL;
}