2015-03-11 1 views
-2

Я относительно новичок в программировании, и это мой первый термин, работающий на C. Таким образом, вполне возможно, что это может быть действительно простая ошибка, или также возможно, что объяснение того, что я сделал не так, может переместиться через мою голову.Seg Ошибка при передаче строк через указатели void в C

Моя программа читает в текстовом файле a строит конкорданс в hashmap, который сообщает пользователю, какие слова находятся в тексте и сколько раз они происходят. Тем не менее, я продолжаю segfault (код 11), всякий раз, когда я использую функцию myCompare. Вот его код:

int myCompare(void *s1, void *s2) 
{ 
    printf("\n\nStarting myCompare..."); 
    printf("\n*s1: %s", (char *)s1); 
    printf("\n*s2: %s", (char *)s2); 

    char *key1 = (char *)s1; 
    printf("\n\nkey1: %s", key1); 
    char *key2 = (char *)s2; 
    printf("\nkey2: %s", key2); 

    return (strcmp(key1, key2)); 
} 

Я добавил некоторые операторы печати, к нему и функция, которая вызывает его, чтобы дать мне лучшее представление о том, что проходит и именно там, где она segfaulting, но я не знаю, почему это происходит. Вот результат, если кому-то нужно больше кода, чтобы понять мою ошибку, просто дайте мне знать. Спасибо, ребята

struct hashLink { 
    void* key; 
    void* value; 
    struct hashLink * next; 
}; 

struct hashMap { 
    hashLink ** table; 
    int tableSize; 
    int count; 
}; 

...

void removeKey (struct hashMap * ht, void* k, comparator keyCompare, hashFuncPtr hashFunc) 
{ 

struct hashLink *previousLink; 
struct hashLink *currentLink; 
int index = 0; 

printf("\n\nVariables Declared"); 
printf("\nPre-hash index: %d", index); 
index = ((*hashFunc)(k) % ht->tableSize); 
void* keyPtr = &ht->table[index]->key; 

printf("\nPost-hash index: %d", index); 
printf("\nkeyPtr value: %p", keyPtr); 
printf("\nk value: %p", k); 

int testCompare = (*keyCompare)(k, keyPtr); 
printf("\nkeyCompare: %d", testCompare); 

if ((*keyCompare)(k, keyPtr) ==)){ 

... } 

Терминал Выход:

Starting hash2... 
Passed key: and 
value of r: 617 

Post-hash index: 7 
keyPtr value: 0x10e65dcd8 
k value: 0x10e65df24 

Starting myCompare... 
*s1: and 
*s2: 

key1: and 
key2: 
keyCompare: 65 

Starting myCompare... 
*s1: 
*s2: and 

key1: 
Segmentation fault: 11 
logout 
+2

Пожалуйста, объясните, как вы вызываете 'myCompare'. – Rufflewind

+0

не использовать 'void *' –

+4

use 'gdb' ...... –

ответ

1

Если вы код, то ошибку сегментации вы, вероятно, пытаются работать с указателями, которые содержат мусор и не фактически указывают на любые данные, которые у вас есть. Попробуйте использовать valgrind.

  • компиляции кода без оптимизации и с символами отладки

    g++ -O0 -g ./your_program.cpp -o ./your_program 
    
  • Использование valgrind «s проверки памяти

    valgrind --leak-check=yes --track-origins=yes ./your_program 
    

Вполне вероятно, что Valgrind скажет вам, что точно не так с вашим кодом.

 Смежные вопросы

  • Нет связанных вопросов^_^