- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在编写一个在共享内存中创建键值存储的程序。感兴趣的代码位于 kv_store_write() 函数中,但我将其余部分包含在上下文中。
内存最终将在不同进程之间共享,这些进程将在同一内存空间中读取和写入值。哈希函数用于提高搜索速度并确定存储位置。
我当前的挑战是以结构化方式存储键值对并访问该结构。我选择了如下定义的嵌套结构。在使用 mmap()
时,我将 void 指针转换为返回到我定义的结构体指针的地址:Pod
。在 kv_store_write() 中,我尝试访问 value
和 key
我得到的编译错误并不能帮助我理解出了什么问题。我是否正确地访问了我的结构的元素?
我对何时使用 ->
和 感到困惑。
编辑:为了完整性,我添加了读取功能。以下是我得到的编译错误:
Assignement_2_1.c: In function ‘kv_store_read’:
Assignement_2_1.c:142:17: error: assignment to expression with array type
valueInStore = memEthienne -> pod[hashedPod].value[podIndex];
^
Assignement_2_1.c:143:11: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type [-Wincompatible-pointer-types]
strcpy(value, valueInStore);// might be a problem with the way I am copying the value
^
In file included from Assignement_2_1.c:6:0:
/usr/include/string.h:125:14: note: expected ‘char * restrict’ but argument is of type ‘char **’
extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
^
Assignement_2_1.c:143:18: warning: passing argument 2 of ‘strcpy’ from incompatible pointer type [-Wincompatible-pointer-types]
strcpy(value, valueInStore);// might be a problem with the way I am copying the value
^
In file included from Assignement_2_1.c:6:0:
/usr/include/string.h:125:14: note: expected ‘const char * restrict’ but argument is of type ‘char **’
extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
^
Assignement_2_1.c:144:11: warning: return from incompatible pointer type [-Wincompatible-pointer-types]
return (value);
^
Assignement_2_1.c:144:11: warning: function returns address of local variable [-Wreturn-local-addr]
Assignement_2_1.c:149:1: error: expected declaration or statement at end of input
}
这是代码
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
//----------------------------------------------------------------------
#define SIZE_OF_KEY 32
#define SIZE_OF_VALUE 256
#define NUMBER_OF_KEYVALUE_PAIRS 256
#define NUMBER_OF_PODS 256
#define SIZE_OF_INDEX 1
#define NUMBER_OF_INDEX 1
#define MEMORY_LENGTH (NUMBER_OF_PODS*NUMBER_OF_KEYVALUE_PAIRS*(SIZE_OF_VALUE + SIZE_OF_KEY + SIZE_OF_INDEX))
//-------------------------------------------------------------------
typedef char KEY[SIZE_OF_KEY];
typedef char VALUE[SIZE_OF_VALUE];
typedef struct{
KEY key[NUMBER_OF_KEYVALUE_PAIRS];
VALUE value[NUMBER_OF_KEYVALUE_PAIRS];
int index;
}keyValue;
typedef struct{
keyValue pod[NUMBER_OF_PODS];
}Pod;
//typedef keyValue Pod[NUMBER_OF_PODS];
int kv_store_create(char *name);
int kv_delete_db();
int kv_store_write(char *key, char *value);
char *kv_store_read(char *key);
char **kv_store_read_all(char *key);
char *DATABASE_NAME = "memoryEthienne";
//-------------------------------------------------------------------
int main(){
kv_store_create(DATABASE_NAME);
}
//-------------------------------------------------------------------
int hash_func(char *word){
int hashAddress = 5381;
for (int counter = 0; word[counter]!='\0'; counter++){
hashAddress = ((hashAddress << 5) + hashAddress) + word[counter];
}
return hashAddress % NUMBER_OF_PODS < 0 ? -hashAddress % NUMBER_OF_PODS : hashAddress % NUMBER_OF_PODS;
}
//-------------------------------------------------------------------
int kv_store_create(char *name){
int fd = shm_open(name, O_CREAT|O_RDWR, S_IRWXU); // shm_open return a file descriptor
Pod* memEthienne = mmap(NULL, MEMORY_LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); // Makes the memory element sharable and useable in the process and returns a pointer to the adress of the memory for the particular process memory space
ftruncate(fd, MEMORY_LENGTH); // This allocates the proper size to memory
close(fd);
DATABASE_NAME = name; // Could be a good idea to initialise the indexes in the creation function
}
//-------------------------------------------------------------------
int kv_store_write(char *key, char *value){
if (strlen(key) > SIZE_OF_KEY){
fprintf(stderr, "Please enter a valid length for the key\n" );
}
if (strlen(value) > SIZE_OF_VALUE){
fprintf(stderr, "Please enter a valid length for the value\n" );
}
struct stat s;
int fd = shm_open(DATABASE_NAME, O_RDWR, 0);
if (fd < 0)
printf("Error...opening shm\n");
if (fstat(fd,&s) == -1){
printf("Error fstat\n");
}
Pod* memEthienne = mmap(NULL, MEMORY_LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); // This returns an adress to shared memory in the and allocates it as a pointer to an array of structs
close(fd);
int hashedPod = hash_func(key);
int podIndex = memEthienne -> pod[hashedPod].index;
memset(&(memEthienne -> pod[hashedPod].key[podIndex]), 0, SIZE_OF_KEY);
memset(&(memEthienne -> pod[hashedPod].value[podIndex]), 0, SIZE_OF_VALUE); //void *memset(void *s, int c, size_t n);
strncpy(memEthienne -> pod[hashedPod].key[podIndex], key, strlen(key)); // strncpy((har *dest, const char *src, size_t n)
strncpy(memEthienne -> pod[hashedPod].value[podIndex], value, strlen(value));
if (podIndex < 255){
(memEthienne -> pod[hashedPod].index)++;
}
else
{
memEthienne -> pod[hashedPod].index = 0;
}
}
//-----------------------------------------------------------------
char *kv_store_read(char *key){ // This function returns a copy of the string currently stored at the location in memory associated with the key
// 1 - Check value entered makes sense
// 2 - Hash the key
// 3 - Create a search counter
// 4 - Search the pod with the hashed key until the (current index -1) and return the associated value
// QUESTION : Am I opening the memory with the appropriate permissions
if (strlen(key) > SIZE_OF_KEY){
fprintf(stderr, "Please enter a valid length for the key\n" );
struct stat s;
int fd = shm_open(DATABASE_NAME, O_RDWR, 0);
if (fd < 0)
printf("Error...opening shm\n");
if (fstat(fd,&s) == -1)
printf("Error fstat\n");
Pod* memEthienne = mmap(NULL, MEMORY_LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); // This returns an adress to shared memory in the and allocagted it as a pointer to an array of structs
close(fd);
int hashedPod = hash_func(key);
int podIndex = memEthienne -> pod[hashedPod].index;
char* value[SIZE_OF_VALUE];
char* valueInStore[SIZE_OF_VALUE];
int searchIndex = 0;
while (searchIndex < podIndex){
if (strcmp((memEthienne -> pod[hashedPod].key[searchIndex]),key) == 0){
valueInStore = memEthienne -> pod[hashedPod].value[podIndex];
strcpy(value, valueInStore);// might be a problem with the way I am copying the value
return (value);
}
searchIndex ++;
}
fprintf(stderr, "Unable to locate the requested key\n" );
}
//------------------------------------------------------------------
最佳答案
这一行
valueInStore = memEthienne -> pod[hashedPod].value[podIndex];
错误,因为 valueInStore
是一个数组,而不是一个指针。 vlueInsStore[0]
可以工作,因为它是一个指针。
这一行
strcpy(value, valueInStore);
错误,因为 value
是一个 char*
指针数组,即它在函数参数的上下文中具有类型 char**
- 我们说它“衰减”为指针。
此外,您还尝试返回value
,即使它是在堆栈上声明的数组,这意味着一旦您返回,它的存储就会消失。
关于c - 从指向嵌套结构的指针访问元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42754115/
有人能给我解释一下我下面程序中的一点吗我编写的以下程序是为了理解 int * const * var 的含义; #include "iostream" using namespace std ; in
我正在摆弄 C 中的指针,但仍然不确定一些非常基础的知识。我想出了以下示例代码: #include int main(void) { int num = 42; /
以下代码产生警告: const char * mystr = "\r\nHello"; void send_str(char * str); void main(void){ send_str
我正在尝试在我的 Linux 计算机上升级 cmake。这是我使用的命令。 删除旧的 cmake: sudo apt purge --auto-remove cmake 从 https://cmake
我试图借助 char 指针来追踪 union 第一个字节的值。我假设 byte1 的输出应该是 ff,但实际上是 ffffffff。如果我错了请纠正我。 #include #include #in
我正在使用微 Controller 进行一些 ADC 测量。当我尝试使用 -O2 优化编译以下代码时遇到问题,当代码中存在 PrintVal() 函数时,MCU 卡住。我做了一些调试,结果发现,当我添
#include #include using namespace std; int main () { vector qwerty; qwerty.push_back(5);
我有我的 woking setup.py 文件;其中包含以下行: home = os.environ["HOME"] # home = /home/dr in my machine; distu
这段代码 #include #include static_assert(std::is_same_v::value_type, volatile int>); 在最新的 GCC 和 clang
我对 C 中的前向声明有疑问。 代码 typedef struct yhash_s t_yhash;// forward declaration struct yhash_s { size_t
我想提取成员指针指向的成员的类型。 template void demo(myClass& instance, void* ptr) { instance.*member = *reinter
我正在尝试使用指针将一段 C 代码转换为 Swift 3。这是 C 代码中的相关部分。 Float32 sampleArray[256] = { // Array is 256 Float value
您可能知道,VLA's haves pros and cons 和它们在 C11 中是可选的。 我想使 VLA 成为可选项的主要原因是:“堆栈可能会爆炸”: int arr[n]; /* where
这段代码有什么错误?为什么我不能按照我尝试的方式取消引用该元素。 #include typedef struct { int value; struct node * left;
有什么方法可以在 JavaScript 中创建\返回指向变量的指针吗? 比如,在 PHP 中: function func() { ..... return &$result; } 我
如果您想使用方法的指针作为参数,则需要将该方法键入作为对象的函数,就像这样好 : type TAcceptor = function(filename:string):boolean of objec
很简单的问题: 我对 C++ 中的智能指针有点陌生。我想我得到了所有权的东西,但我不知道如何访问他们实际指向的内容。当我尝试使用对象的成员函数/变量时,我只是得到了 unique_ptr 类的函数,这
我得到了一个点的方位 Angular 、指南针方向和一个可以将箭头设置到某个方向的 api(0 是顶部,90 是右侧,180 是底部,360 是顶部) 如果我希望箭头指向我采用方位 Angular 形
我正在尝试找到一种方法,从单元格中获取位于当前工作表左侧(托盘下方)的工作表单元格中的数据。 我知道如何通过调用其他工作表 =Sheet1!A1 但现在我需要一些最好的解释 =Sheet[-1]!A1
所以我在 MATLAB 中有一个 for 循环,其中向量 x 将通过一个函数,比如 cos(x).^2,或者不同的选择,比如 sin(x).^2 + 9.*x。用户将在 for 循环之前选择他想使用的
我是一名优秀的程序员,十分优秀!