2017-04-21 168 views
0

我正在編寫一個程序,它創建並使用一個哈希表並使用共享內存。我的程序有效,但有時會導致分段錯誤。我相信自從我第一次使用共享內存段以來,我一直沒有正確地分離它。 我是否應該每次使用它時分開段?在此先感謝您的幫助!如何正確分離共享內存段 - 分段錯誤

代碼:

#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倍。變量數組也被聲明爲全局變量。

+0

你可以添加像'st_arr','array'等變量聲明嗎? – mch

+0

@mch是的,我會編輯 –

+0

'while(strcmp((* array)[hashIndex],「0」)&&(hashIndex mch

回答

0

您應該檢查hashIndexhashIndex + (value)的限制範圍。我的意思是在你的完整執行檢查中,如果hashIndexhashIndex + (value)超出限制(例如SIZE

+0

我會仔細檢查它,雖然在我的代碼我不分離任何地方的共享內存段(這是我主要關心的)。可以這樣做嗎? –

+0

如果您分配內存@運行時間,那麼你應該讓它們在超出範圍之後立即釋放。 –