Я пытаюсь изучить C, и я сталкиваюсь с проблемами, используя char * и массивы char.Я использую универсальный контейнер с хэш-набором из библиотеки (который я не хочу описывать подробно).Эта библиотека включает в себя функцию
void *HashSetLookup(hashset *h, const void *elemAddr);
, которую я должен использовать для поиска в хэш-наборе, чтобы увидеть, существует ли там элемент (функции хеш-функции и сравнения являются частью структуры хэш-набора).В этом случае я использую hashset для хранения указателей на C-строки или, более конкретно, (char * *).Моя проблема заключается в том, что следующий код дает ошибку сегментации:
char word[1024];
/* Some code that writes to the word buffer */
HashSetLookup(stopList, &word);
, в то время как этот код работает нормально (и как ожидалось):
char word[1024];
/* The same code as before that writes to the word buffer */
char* tmp = strdup(word);
HashSetLookup(stopList, &tmp);
free(tmp);
Я думал, что слово char [] и символ *были в основном то же самое.Единственное отличие состоит в том, что символьное слово [1024] находится в стеке с фиксированной длиной 1024, но tmp в куче занимает столько места, сколько необходимо (strlen (word) +1).
Поэтому яне понимаю, почему я должен сделать копию строки в куче, чтобы иметь возможность вызывать эту функцию.Почему это происходит?Есть ли еще фундаментальная разница между char * tmp = strdup ("что-то") и словом char [1024] = "что-то"?