2012-03-16 34 views
2

基本上我有一些代码会导致seg错误。原因是因为我的数据结构的当前大小正在发生变化,我不知道如何。在newMap函数中,我将map的大小设置为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)); 

这是问题之一。如果您解决了这个问题并且出现了更多错误,请尝试自己解决,如果不能,请使用额外信息编辑您的问题。