c - 发生段错误是因为变量正在更改

标签 c segmentation-fault

基本上我有一些代码可以保持段错误。原因是因为我的数据结构的当前大小正在改变,我不知道如何改变。在 newMap 函数中,我将 map 的大小设置为 0,然后一旦我设置了函数指针的值,大小就完全不同了。我不确定我在这里做错了什么。

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

最佳答案

在这一行:

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

map 是一个 Map*,因此您分配的是堆上内存指针的大小,不是 map 。应该是

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

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

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

关于c - 发生段错误是因为变量正在更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9743545/

相关文章:

linux - 为什么我遇到段错误?

c - 段错误spoj协助

c - 段错误,调试

c - 使用远程 GDB 在 Eclipse 中调试

c - 我试图使用 for 循环找到素数 1-n

c - 测量 Unix 域套接字的延迟

c - 这个段错误是什么意思

c - 如何在 linux 中使用 exec 命令使用 wget 命令?

c++ - 你为什么不能移动 uint16_t

c++ - 函数递归的最大次数c++