2012-03-16 5 views
2

기본적으로 seg 오류가 발생하는 코드가 있습니다. 그 이유는 내 데이터 구조의 현재 크기가 변경되고 어떻게 작동하는지 모르기 때문입니다. newMap 함수에서 맵의 크기를 0으로 설정하면 함수 포인터의 값을 일단 설정하면 크기가 완전히 다릅니다. 내가 여기서 잘못하고있는 것이 확실하지 않습니다.변수가 변경되기 때문에 Seg 오류가 발생합니다.

Map.h

#ifndef MAP_H 
#define MAP_H 

typedef struct MapS Map; 

struct MapS{ 
    void* mapPrivateVars; 
    void (*add)(Map*, void*, void*); 
    void* (*getValue)(Map*, void*); 
    long (*getSize)(Map*); 
}; 


Map* newMap(); 
#endif 

Map.c

#include "Map.h" 
#include <stdlib.h> 
#include <stdio.h> 

void addKey(Map* map, void* key, void* value); 
void* getKey(Map* map, void* key); 
long sizeMap(Map* map); 

#define INITIAL_KEY_VALUE_ARRAY_SIZE 100 

typedef struct{ 
    void* key; 
    void* value; 
}KeyValuePair; 

typedef struct{ 
    int size; 
    int maxSize; 
    KeyValuePair** keyValuePairArray; 
}MapPrivate; 

Map* newMap(){ 
    Map* map = malloc(sizeof(map)); 
    if(map==NULL){ 
     exit(5); 
    } 
    map->add = NULL; 
    map->getValue = NULL; 
    map->getSize = NULL; 
    MapPrivate* mapPrivate = malloc(sizeof(MapPrivate)); 
    if(mapPrivate==NULL){ 
     exit(6); 
    } 
    KeyValuePair** kvpa = (KeyValuePair**)malloc(INITIAL_KEY_VALUE_ARRAY_SIZE*sizeof(KeyValuePair*)); 
    mapPrivate->keyValuePairArray = kvpa; 
    if(mapPrivate->keyValuePairArray==NULL){ 
     exit(7); 
    } 

    map->mapPrivateVars = (void*)mapPrivate; 
    MapPrivate* mpv = (MapPrivate*) map->mapPrivateVars; 
    mpv->maxSize = INITIAL_KEY_VALUE_ARRAY_SIZE; 
    mpv->size = 0; 
    printf("size in constructor after assignment is %d\r\n", mpv->size); 
    map->add = addKey; 
    map->getValue = getKey; 
    map->getSize = sizeMap; 

    printf("size in constructor before end is %d\r\n", mpv->size); 
    return map; 
} 


void addKey(Map* map, void* key, void* value){ 
    MapPrivate* privateVars = (MapPrivate*) map->mapPrivateVars; 
    if(privateVars->size == privateVars->maxSize){ 
     //TODO: realloc with more space 
     exit(100); 
    } 
    KeyValuePair* kvp = malloc(sizeof(KeyValuePair)); 
    if(kvp==NULL){ 
     exit(8); 
    } 
    printf("addKey malloced kvp\r\n"); 
    kvp->key = key; 
    kvp->value = value; 
    printf("addKey assigned key and value kvp\r\n"); 
    printf("size is %d\r\n", privateVars->size); 
    privateVars->keyValuePairArray[privateVars->size] = kvp; 
    printf("addKey added new kvp to kvparray \r\n"); 
    privateVars->size++; 
    printf("addKey incremented size kvp\r\n"); 
} 

void* getKey(Map* map, void* key){ 
    MapPrivate* privateVars = (MapPrivate*) map->mapPrivateVars; 
    int i; 
    for(i = 0; i < privateVars->size;i++){ 
     if(privateVars->keyValuePairArray[i]->key == key){ 
      return privateVars->keyValuePairArray[i]->value; 
     } 
    } 
    return NULL; 
} 

long sizeMap(Map* map){ 
    MapPrivate* privateVars = (MapPrivate*) map->mapPrivateVars; 
    return privateVars->size; 
} 

MapTest.c

#include "Map.h" 
#include <stdio.h> 


int main(void){ 
    Map* map = newMap(); 
    char* dude = "dude"; 
    char* awesome = "awesome"; 
    char* meh = "meh"; 
    map->add(map, dude, meh); 
    map->add(map, awesome, dude); 
    map->add(map, meh, awesome); 
    return 0; 
} 

샘플 출력

size in constructor after assignment is 0 
size in constructor before end is 180657104 
addKey malloced kvp 
addKey assigned key and value kvp 
size is 180657104 
Segmentation fault: 11 

답변

6
이 라인에

:

Map* map = malloc(sizeof(map)); 

mapMap*, 그래서 당신은 힙의 메모리 포인터의 크기를 할당하는, 하지Map의 크기입니다. 그것은해야 하나

Map* map = malloc(sizeof(*map)); 

또는 문제 중 하나입니다

Map* map = malloc(sizeof(Map)); 

. 문제를 해결하고 더 잘못된 것이 있다면 스스로 해결하고 시도 할 수 없다면 추가 정보로 질문을 편집하십시오.

관련 문제