Я получаю ошибку сегментации, когда я вызываю массив, чтобы отметить битовую позицию соответствующей битовой позиции в множестве без знака int [9] с его индексом в именах массива глобальных имен [320] [30].Когда я запускаю программу, я использую ./a.out Кроме того, typedef unsinged int Set[10];
Вот код, где я вызываю функцию addName2Set
//add name to unsigned int set
void addName2Set(Set set, char *key){
int index;
//binary search to get index for key
index = binarySearch(names, key, 0, 319);
//call add2set to add index to set
add2Set(set, index);
}
Вот add2Set
//add value passed to set passed
void add2Set(Set set, int index){
int element, position;
//find which element, set[element] of set index is in
element = findArrayElement(index);
//convert index to bit position 0-31 in set[element]
position = findElementPos(element, index);
//in set[element], set bit position 'position' to 1
set[element] = set[element] | (1 << position);
}
Вот функции findArrayElement и findElementPos
//for unsigned int set[i], return i
int findArrayElement(int index){
//index range [j,i]
int i;
int j=0;
//element in set array
int element;
//loop through [j,i], return element if range true
for(i=31; i<320; i+=32){
if(i <= i && index >= j){
return element;
}
j+=32;
element++;
}
}
//find bit position 0-31 corresponding to index
int findElementPos(int element, int index){
int j;
int position;
j = element*32;
position = index - j + 1;
//return bit position
return position;
}
И, наконец, вот где я вызываю функцию addName2Member
//declare key pointer
char *key = (char*)malloc(30);
//set search word to pointer key
strcpy(key, "clean");
//addName2Set
addName2Set(set1,key);
Кто-нибудь увидит причину ошибки сегментации, когдаЯ запускаю программу?«Очистить» - это первое слово в списке data.dat.
Вот результаты valgrind
== 1645 == Недопустимое чтение размера 4
==1645 == в 0x8048860: add2Set (set.c: 61)
== 1645 == по 0x8048A5D: addName2Set (set.c: 145)
== 1645 == по 0x80485D2:main (driver.c: 29)
== 1645 == Адрес 0x9DBED860 не является стековым, malloc или (недавно) свободным
== 1645 ==
== 1645 == Процесс завершается с действием по умолчанию для сигнала 11 (SIGSEGV)
== 1645 == GPF (указатель вне границ?)
== 1645 ==в 0x8048860: add2Set (set.c: 61)
== 1645 == по 0x8048A5D: addName2Set (set.c: 145)
== 1645 == по 0x80485D2: main (драйвер).c: 29)