Я использую функцию таНос и инициализирует некоторую память для хэш-функции, например:Возвращаясь указатель на структуру malloc'ed в функции
int main (int argc, char * argv [])
{
Bucket * hashTable;
hashTable = createHashTable();
...
в «main.c»
функция вызывается в другом файле заключается в следующем:
Bucket * createHashTable()
{
Bucket * hashTable = malloc (sizeof(Bucket) * HASHSIZE);
int c=0;
for (c=0;c<HASHSIZE;c++)
{
hashTable[c].key=NULL;
hashTable[c].text=NULL;
hashTable[c].next=NULL;
}
return hashTable;
}
Моя программа компилируется с «-pedantic -Wall», но ошибки сегментации. Использование GDB, я получаю это:
Reading symbols from hash...done.
(gdb) break 11
Breakpoint 1 at 0x400990: file main.c, line 11.
(gdb) run
Starting program: /home/user/Projects/random/hash
Breakpoint 1, main (argc=1, argv=0x7fffffffdf78) at main.c:11
11 hashTable = createHashTable();
(gdb) print hashTable
$1 = (Bucket *) 0x400520 <_start>
(gdb) print * hashTable
$2 = {
key = 0x89485ed18949ed31 <error: Cannot access memory at address 0x89485ed18949ed31>,
text = 0x495450f0e48348e2 <error: Cannot access memory at address
0x495450f0e48348e2>, next = 0xc74800400a90c0c7}
(gdb)
Часть заголовка с «ковшом» определение: структура
typedef struct bucket{
char * key;
char * text;
struct bucket * next;
} Bucket;
Является ли это проблемой сфера? Когда функция закончена, она убивает мою память malloc'а или что?
Платформа - это 64-разрядная Linux, а адрес, возвращенный из malloc(), на этот раз был 0x1665010 - я предполагаю, что если бы это было неудачно, это было бы NULL.
EDIT: Следующая функция после этого, в main.c, пытается добавить запись в таблицу:
printf("Adding banana...\n");
addItem("Banana", "Bananas are yellow", &hashTable);
(да, да - бананы, я знаю) функция является:
void addItem(char * key, char * data, Bucket ** table)
{
unsigned int hashkey;
hashkey=hash(key);
printf("%lu\n",strlen(key));
if (!table[hashkey]->text) /* SEGFAULTS HERE */
{
table[hashkey]->key=key;
table[hashkey]->text=data;
}
else
{
Bucket * newListElement = malloc(sizeof(Bucket));
newListElement->key=key;
newListElement->text=data;
newListElement->next = NULL;
table[hashkey]->next = newListElement;
}
}
Это кажется действительным. На какой платформе вы работаете? Является ли 'malloc' возвращающим действительный адрес или сбой (возвращающий NULL)? – slugonamission
Чтобы помочь вам проверить это, вы должны предоставить полный минимальный пример. Например, какие файлы заголовков вы включаете? Каково определение «Ведро»? и т. д. – glglgl
Подождите, вы уверены, что это сбой на этой линии? Ваша команда 'break 11' для GCC сломает * до *, строка будет выполнена. – slugonamission