0

私はUbuntuでEclipseC/ C ++ IDEを使用しておりchar、親子プロセス間の共有メモリとしての2Dを定義しようとしており、これを使用しています。

void fill(char **p)
{
    printf ("int i=0;\n");
    int i=0;
    printf ("int j=0;\n");
    int j=0;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            p[i][j]=' ';
        }
    }
}


int shmid;
char **shmPtr;
if(shmid = shmget(2000, sizeof(char[3][3]), 0)!=-1)
{
    shmPtr = shmat(shmid, 0, 0); //attach shared memory to pointer
    fill(shmPtr);
}

これは配列を定義する正しい方法ですか?この配列を埋めようとしている間、私は

セグメンテーション違反

4

2 に答える 2

1

まさに私が疑ったこと。2次元配列はダブルポインタではありません。

void fill(char p[3][3])
{
    int i, j;
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            p[i][j] = ' ';
        }
    }
}

int shmid = shmget(2000, sizeof(char[3][3]), 0);
char (*shmPtr)[3] = shmat(shmid, 0, 0);
fill(shmPtr);
于 2013-02-18T17:18:00.633 に答える
0

共有メモリ(実際には一般的に動的に割り当てられます)を使用する場合は、「[i] [j]」の代わりに、次の演算を使用して2Dデータにアクセスすることをお勧めします。

*(pointer + row * ncols + col) = ...

また、文字列 ""(const char *)の代わりに文字''を使用する必要があります。サンプルでは、​​fill関数は次のようになります。

void fill(char *p, int rows, int cols)
{
    int i, j;
    for(i=0; i<rows; i++)
    {
        for(j=0;j<cols;j++)
        {
            /* p[i][j] = ' '; */
            *(p + i*cols + j) = ' ';
        }
    }
}

もう1つ、さらに良いのは、memsetを使用することです。

void fill(char *p, int rows, int cols)
{
    memset(p, (int)' ', cols*rows);
}

そして、主なサンプル:

int main()
{
    int shmid;
    void *shmPtr;
    char *shm;
    /* create the shared segment */
    if ((shmid = shmget(IPC_PRIVATE, sizeof(char) * (3*3), IPC_CREAT | 0666)) < 0) {
        perror("shmget");
        exit(1);
    }
    /* use it on the parent process */
    if ((shmPtr = shmat(shmid, NULL, 0)) == (char *) -1) {
        perror("shmat");
        exit(1);
    }
    shm = (char *)shmPtr;
    /* fill with spaces */
    fill(shmPtr, 3, 3);
    int i;
    /* some forks, sample */
    for (i = 0; i < 10; i++) {
        if (fork() == 0) {
                ... child workd ...
        }
    }
    ...
    shmctl(shmid, IPC_RMID, NULL);
    return 0;
}

可能であれば、mmapSysV共有メモリの代わりにもう1つ使用してみてください。

于 2013-02-18T17:31:06.783 に答える