我是C的新手,我在使用指针和值时遇到了一些麻烦。
所以我正在创建一个哈希表,我的插入函数出错(错误在代码后发布):
typedef struct WordList {
char *word;
struct WordList *next;
} WordList;
typedef struct HashTable {
int key;
struct WordList *value;
struct HashTable *next;
} HashTable;
#define TABLE_SIZE 8192
HashTable *table[TABLE_SIZE] = { NULL };
//Insert element
void insertElement(int key, char *word) {
int i = 0;
// check if key has already existed
while((&(table[i]->key) != NULL) && (i < TABLE_SIZE)) {
// !!!! ERROR HERE !!!! if(table[i]->key == key) { // if find key
// ... implementation
return; // exit function and skip the rest
}
i++; // increment loop index
}
// find a NULL slot and store key and value
if(&(table[i]->key) == NULL) {
// !!! ERROR HERE!!! table[i]->key = key;
// ... implementation
}
}
int main() {
// test call
insertElement(1, "blah\0");
int i;
for ( i=0; i < 10; i++)
{
printf("%d: ", i);
struct HashTable *tableTemp = table[i];
while (tableTemp != NULL)
{
printf("(%d)\n", tableTemp->key);
tableTemp = tableTemp->next;
}
printf("\n");
}
return 0;
}
我使用valgrind,这是我对分配表[i] - &gt;的错误key = key
Invalid write of size 4
Address 0x0 is not stack'd, malloc'd or (recently) free'd
答案 0 :(得分:1)
一般而言,地址public function setImgProfileAttribute($value)
{
$this->attributes['img_profile'] = '/private/var/tmp/phpceBMP2/'. $value;
}
是空指针;你试图用空指针写一个4字节的值(可能是0x0
) - 比如int
,但它可能不是那么明显。
在您的骨架代码中,您有:
int *p = 0; *p = 1;
评论:
您应该已经显示了错误的实际代码。我们必须猜测,因为你没有表现出来。
您刚刚确认if (&(table[i]->key) == NULL) {
// !!! ERROR HERE!!! table[i]->key = key;
的地址是空指针,当您尝试将table[i]->key
分配给它时会导致问题。
将来,请提供足够的真实代码,我们可以看到您的MCVE(How to create a Minimal, Complete, and Verifiable Example?)或SSCCE(Short, Self-Contained, Correct Example) - 两个名称和相同基本想法的链接。