c其他函数和结构中的malloc

c其他函数和结构中的malloc,c,C,我在c和指针方面有问题。我一直在努力,这必须很容易。我有一个结构,在一个函数中分配,然后将指针传递回原始函数。但当我尝试用其他变量填充结构的值,然后打印或复制它们时,应用程序会错误地说内存地址超出了范围 struct memcache_buffer{ int elements, action; char keys[MAX_KEYS], values[MAX_KEYS], returns[MAX_KEYS]; //action 0 = delete , 1 = g

我在c和指针方面有问题。我一直在努力,这必须很容易。我有一个结构,在一个函数中分配,然后将指针传递回原始函数。但当我尝试用其他变量填充结构的值,然后打印或复制它们时,应用程序会错误地说内存地址超出了范围

struct memcache_buffer{
        int  elements, action;
        char keys[MAX_KEYS], values[MAX_KEYS], returns[MAX_KEYS]; //action 0 = delete , 1 = get 2 = set
}memcache_buffer;

struct memcache_buffer* memcache_allocate_buffer(int size){
        struct memcache_buffer *buffer;
        buffer =malloc(sizeof(struct memcache_buffer));
        return buffer;
}

void memcache_set(char * key, char * value){
        pthread_t process_t;
        struct memcache_buffer *buffer=memcache_allocate_buffer(1);
        char keys,values;
        buffer->elements = 1;
        buffer->action=2;
        //printf("crash?\n");
        printf("%s %s",key,value);
        snprintf(buffer->keys[0],KEY_SIZE,"%s",key);
        snprintf(buffer->values[0],VALUE_SIZE,"%s",value);
        pthread_create(&process_t,NULL,memcache_process,buffer);
}
我的内存分配正确吗?分配内存和这些指针肯定很粗糙,尤其是过去只会弄乱php

这是你的问题:

struct memcache_buffer{
    char keys[MAX_KEYS], values[MAX_KEYS]
}

snprintf(buffer->keys[0],KEY_SIZE,"%s",key);
                     ^^^
snprintf(buffer->values[0],VALUE_SIZE,"%s",value);
                       ^^^
删除
[0]
snprintf
将尝试取消引用某些伪值。

这是您的问题:

struct memcache_buffer{
    char keys[MAX_KEYS], values[MAX_KEYS]
}

snprintf(buffer->keys[0],KEY_SIZE,"%s",key);
                     ^^^
snprintf(buffer->values[0],VALUE_SIZE,"%s",value);
                       ^^^

删除
[0]
snprintf
将尝试取消引用某些伪值。

是否使用
valgrind
调试内存泄漏?编译时是否启用了所有警告?你读过什么关于C编程的书?您的pastebin不是一个完整的代码,因此我们无法真正提供帮助。(是否
key
value
正确?)“8\304\t\bȵ\t\b\020您是否使用
valgrind
调试内存泄漏?您是否在启用所有警告的情况下编译?您阅读了关于C编程的哪本书?您的粘贴库不是完整的代码,因此我们无法提供真正的帮助。(是否
key
value
正确?)在什么样的谎言中你看到了segfault?id第二次使用valgrind-最近学会了使用memcheck和massif,我想说它们是C开发的关键工具#0(string=0xffffffd8,maxlen=,format=0x28e4e7“%s”,args=0xbffeb4fc“8\304\t\bȵ\t\b\020如果启用所有警告并使用足够好的编译器(GCC、Clang等),编译器应该已经警告过您了。”@我的观点中的BasileStrynkevitch编译器应该默认启用此内容的警告。同意,但有些编译器不这样做,有些新手也不会要求所有警告,或者忽略它们。但是当我有多个键时会发生什么情况。那么关于不发布完整代码,这篇文章上没有足够的空间容纳所有的dbmail。我将粘贴bin我正在添加的函数的完整代码。有很多。我读了什么书?我读了sams的《24小时学习c》,就像15年前一样,在过去的一周里,我一直在使用google和stack overflow学习所有这些东西。我不是c程序员。@Hiett
-Wall-Wextra
。如果你的目标是可移植性,可以选择
-pedantic
y、 如果启用了所有警告并使用了足够好的编译器(GCC、Clang等),编译器应该已经警告过您了@我的观点中的BasileStrynkevitch编译器应该默认启用此内容的警告。同意,但有些编译器不这样做,有些新手也不会要求所有警告,或者忽略它们。但是当我有多个键时会发生什么情况。那么关于不发布完整代码,这篇文章上没有足够的空间容纳所有的dbmail。我将粘贴bin我正在添加的函数的完整代码。有很多。我读了什么书?我读了sams的《24小时学习c》,就像15年前一样,在过去的一周里,我一直在使用google和stack overflow学习所有这些东西。我不是c程序员。@Hiett
-Wall-Wextra
。如果你的目标是可移植性,可以选择
-pedantic
Y