我正在編寫一個程序,它創建並使用一個哈希表並使用共享內存。我的程序有效,但有時會導致分段錯誤。我相信自從我第一次使用共享內存段以來,我一直沒有正確地分離它。 我是否應該每次使用它時分開段?在此先感謝您的幫助!如何正確分離共享內存段 - 分段錯誤
代碼:
#define SIZE 83000
int indexar = 0;
int shared = 0;
char Entries[SIZE][256];
char st_arr[SIZE][256];
int shmid;
char (*array)[SIZE][50];
int foo = 0;
void put(char *key, char *value) {
//item->uniq = uniq;
int found = 0 ;
shmid = shmget(123, SIZE * 50, IPC_CREAT | 0666);
array = shmat(shmid, 0, 0);
strcpy(st_arr[indexar], key);
if (foo == 0) { /* shared memory initialized once */
for (int i = 0; i < SIZE; i++)
{
strcpy((*array)[i], "0");
}
foo = 1;
}
for (int i = 0; i < indexar ; i++) {
if (!strcmp(st_arr[i], key)) {
found = found + 1;
}
}
//get the hash
unsigned long hashIndex = get_hashed(key, found);
//move in array until an empty or deleted cell
while ((strcmp((*array)[hashIndex], "0") && (strcmp((*array)[hashIndex + 1], "0")))) {
//go to next cell
hashIndex = hashIndex + 2;
//wrap around the table
hashIndex %= SIZE;
}
//strcpy(Entries[hashIndex],key);
//strcpy(Entries[hashIndex+1],value);
//printf("%d shmid\n",shmid);
//char (*array)[SIZE][50];
//shmid = shmget(123, SIZE * 50, IPC_CREAT | 0666); //for shared memory
//array = shmat(shmid, (void *)0, 0);
printf("%d\n", hashIndex);
strcpy((*array)[hashIndex], key);
strcpy((*array)[hashIndex + 1], value);
printf("\n[%d] = %s---\n", hashIndex, (*array)[hashIndex]);
//shmdt((void *) array);
indexar = indexar + 1;
shared = shared + 2;
}
///////////////////////////////////////
char *get(char *key) {
//get the hash
int uniq = 0;
unsigned long hashIndex = get_hashed(key, uniq) ;
shmid = shmget(123, SIZE * 50, IPC_CREAT | 0666);
array = shmat(shmid, 0, 0);
//move in array until an empty
while (strcmp((*array)[hashIndex], "0") && (hashIndex<SIZE)) {
if (strncmp((*array)[hashIndex] , key, 4) == 0) {
//printf("%lu \n",hashIndex);
//shmdt((void *) array);
return (*array)[hashIndex + 1];
}
//go to next cell
++hashIndex;
//wrap around the table
hashIndex %= SIZE;
}
//printf("%lu \n", hashIndex);
//shmdt((void *) array);
return "not found";
}
編輯:代碼的工作,但它給分割的錯,如果我用把()函數的4-5倍。變量數組也被聲明爲全局變量。
你可以添加像'st_arr','array'等變量聲明嗎? – mch
@mch是的,我會編輯 –
'while(strcmp((* array)[hashIndex],「0」)&&(hashIndex
mch