我有一个指向结构的指针数组,我正在尝试循环使用。我对如何完全初始化它并不完全有信心,但我一直这样做:
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
}
}
答案 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;
}