【问题标题】:Saving array of structs to shared memory将结构数组保存到共享内存
【发布时间】:2012-03-11 22:43:40
【问题描述】:

我正在尝试创建一个包含结构数组的共享内存。在我当前的代码中,当我运行它时,我遇到了分段错误。我想我可能需要使用 memcpy,但目前我被严重卡住了。任何帮助将不胜感激...

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/shm.h>
#include <unistd.h>
#include "header.h"


int main()
{
    key_t key = 1234;
    int shmid;
    int i = 1;

    struct companyInfo * pdata[5];

    strcpy(pdata[0]->companyName,"AIB");
    pdata[0]->sharePrice = 11.02;
    strcpy(pdata[1]->companyName,"Bank Of Ireland");
    pdata[1]->sharePrice = 10.02;
    strcpy(pdata[2]->companyName,"Permanent TSB");
    pdata[2]->sharePrice = 9.02;
    strcpy(pdata[3]->companyName,"Bank Od Scotland");
    pdata[3]->sharePrice = 8.02;
    strcpy(pdata[4]->companyName,"Ulster Bank");
    pdata[4]->sharePrice = 7.02;



    int sizeOfCompanyInfo = sizeof(struct companyInfo);

    int sizeMem = sizeOfCompanyInfo*5;

    printf("Memory Size: %d\n", sizeMem);

    shmid = shmget(key, sizeMem, 0644 | IPC_CREAT);
    if(shmid == -1)
    {
        perror("shmget");       
        exit(1);
    }

    *pdata = (struct companyInfo*) shmat(shmid, (void*) 0, 0);
    if(*pdata == (struct companyInfo*) -1)
    {
        perror("schmat error");
        exit(1);
    }

    printf("name is %s and %f . \n",pdata[0]->companyName,pdata[0]->sharePrice);

    exit(0);

}

header.h文件如下...

struct companyInfo
{
    double sharePrice;
    char companyName[100];
}; 

【问题讨论】:

  • 你的代码中的什么地方发生了段错误?您可以使用调试器单步执行,甚至只是将printf() 语句放入以至少查看崩溃发生的位置吗?
  • 它似乎不喜欢我为数组赋值,当我 strcpy 进入 pdata[1] 时,会发生分段错误。我通过加入 printfs 找到了它
  • 那么听起来pdata[1] 没有正确初始化。幸运的是,下面有几个答案可以解释如何解决这个问题。
  • 您有两个答案可以指出问题所在。我会接受 hmjd 的回答,因为它更完整并提供代码。

标签: c shared-memory


【解决方案1】:
struct companyInfo * pdata[5];

包含一个由 5 个未初始化指针组成的数组。在使用它们之前,您还需要为数组中的每个元素分配内存:

for (int i = 0; i < 5; i++)
{
    pdata[i] = malloc(sizeof(companyInfo));
}

或者只是声明一个 struct companyInfo 数组,因为似乎不需要动态分配:

struct companyInfo pdata[5];

【讨论】:

【解决方案2】:

pdata 是一个指针表,因此您需要使用 malloc 创建每个 struct companyInfo 才能访问它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-11
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多