C 将2d动态整数数组解析到共享内存

C 将2d动态整数数组解析到共享内存,c,ubuntu,shared-memory,C,Ubuntu,Shared Memory,我试图建立一个程序,通过使用共享内存将2d动态数组解析为其他程序。我搜索了很多,但我有点困惑,因为我对这个不熟悉。 到目前为止,我的代码是: int main (int argc, char* argv []){ int rows,columns; if( argc < 3 ){ printf("Need The size of the 2d array\n"); return 0; } rows = atoi(argv[1]

我试图建立一个程序,通过使用共享内存将2d动态数组解析为其他程序。我搜索了很多,但我有点困惑,因为我对这个不熟悉。 到目前为止,我的代码是:

int main (int argc, char* argv []){
    int rows,columns;
    if( argc < 3 ){
        printf("Need The size of the 2d array\n");
        return 0;
    }
    rows = atoi(argv[1]);
    columns = atoi(argv[2]);

    time_t t;
    srand((unsigned) time(&t));

    key_t key = ftok(".",'a');
    size_t size = sizeof(key_t) + (rows * columns + 2 + rows) * sizeof(int);
    int shmid = shmget(key,size,IPC_CREAT|IPC_EXCL|S_IRWXU);
    int *memory = shmat(shmid, NULL, 0);
    printf("Shared Memory Key: %d\n", key);

    int *argsflag = memory;
    int *resflag= memory + 1;
    int *res  = memory + 2;

    int **array = (int **) memory + (rows*columns);

    for(int i = 0; i < rows ; i++) {
        for(int j = 0; j < columns; j++) {
            array[i][j] = rand() % 100;
        }
    }
    for(int i = 0; i < rows ; i++) {
        for(int j = 0; j < columns; j++) {
            printf("%d ",array[i][j]);
        }
        printf("\n");
    }


    shmctl(shmid,IPC_RMID,NULL);
    shmdt(memory);
    return(0);
}
intmain(intargc,char*argv[]){
int行、列;
如果(argc<3){
printf(“需要2d数组的大小\n”);
返回0;
}
行=atoi(argv[1]);
列=atoi(argv[2]);
时间;
srand((未签名)时间(&t));
key_t key=ftok(“.”和“a”);
大小=大小(键)+(行*列+2+行)*大小(整数);
int shmid=shmget(键、大小、IPC|U创建| IPC|U不包括| S|IRWXU);
int*memory=shmat(shmid,NULL,0);
printf(“共享内存密钥:%d\n”,密钥);
int*argsflag=内存;
int*resflag=memory+1;
int*res=内存+2;
int**数组=(int**)内存+(行*列);
对于(int i=0;i

我得到了一个分段错误(核心转储),我不知道为什么。通过搜索,我找到了一个使用struct的解决方案,但我不知道如何构建它。

在二维数组中不能有
int**
点。它只能指向
int*
一维数组中的第一个元素

此外,
内存+(行*列)
的逻辑是什么?最后将指针设置为数组的最后一项,而不是第一项

请尝试以下方法:

void* memory = shmat( ... 
...
int (*array)[columns] = memory;
...
array[i][j] = ... ;
其中
int(*array)[columns]
是一个数组指针,它指向2D数组中的第一个数组


有关详细信息,请参见。

二维数组中不能有
int**
点。它只能指向
int*
一维数组中的第一个元素

此外,
内存+(行*列)
的逻辑是什么?最后将指针设置为数组的最后一项,而不是第一项

请尝试以下方法:

void* memory = shmat( ... 
...
int (*array)[columns] = memory;
...
array[i][j] = ... ;
其中
int(*array)[columns]
是一个数组指针,它指向2D数组中的第一个数组


有关详细信息,请参见。

指向指针的指针与数组的数组不同。有关原因的解释,请参见。要解决您的问题,您需要创建
array
作为指向数组的指针(例如
int(*array)[COLUMN_SIZE];
)。另外,您的计算
memory+(rows*columns)
似乎是错误的,因为它可能几乎指向数组的末尾。对于内存,我想在共享内存中解析一个键和intI的2d动态数组,请参见数组的答案,我想我知道区别!但我的问题仍然是,我不知道如何将我的2d动态数组解析为共享内存的allready分配内存。作为补充说明,您应该清理argv数据,确保它在合理范围内等。
strlen
将告诉您位数,这是一个很好的指示。一旦这样做了,就应该始终使用
strtoul
(家族)而不是
atoi
,因为后者没有错误处理,依赖于prisitine输入,而前者在遇到错误数据时会优雅地停止。指向指针的指针与数组的指针不同。有关原因的解释,请参见。要解决您的问题,您需要创建
array
作为指向数组的指针(例如
int(*array)[COLUMN_SIZE];
)。另外,您的计算
memory+(rows*columns)
似乎是错误的,因为它可能几乎指向数组的末尾。对于内存,我想在共享内存中解析一个键和intI的2d动态数组,请参见数组的答案,我想我知道区别!但我的问题仍然是,我不知道如何将我的2d动态数组解析为共享内存的allready分配内存。作为补充说明,您应该清理argv数据,确保它在合理范围内等。
strlen
将告诉您位数,这是一个很好的指示。一旦这样做了,就应该始终使用
strtoul
(family)而不是
atoi
,因为后者没有错误处理,依赖于prisitine输入,而前者在遇到错误数据时会优雅地停止;如你所说,然后我必须分配数组?比如数组[i]=(int)malloc(columns*sizeof(int))?首先,我制作了一个指针数组,现在我必须让这些指针看看我的int数组?∑ωτηρηηηςωαννιΔηης忘记指针数组吧,它不是你拥有的、想要的或需要的。在我做了更改之后,我仍然得到同样的错误!int(*数组)[列]=内存;在这之后,我的数组准备好保存整数了,或者我必须做一些其他的思考,因为我仍然对@∑ωτηρηηςiωαννιΔης感到困惑,那么可能与您使用
shmget
&朋友有关。我对这个API不太熟悉,所以在这方面我帮不了你;如你所说,然后我必须分配数组?比如数组[i]=(int)malloc(columns*sizeof(int))?首先,我制作了一个指针数组,现在我必须让这些指针看看我的int数组?∑ωτηρηηηςωαννιΔηης忘记指针数组吧,它不是你拥有的、想要的或需要的。在我做了更改之后,我仍然得到同样的错误!int(*数组)[列]=内存;在这之后,我的数组准备好保存整数了,或者我必须做一些其他的思考,因为我仍然对@∑ωτηρηηςiωαννιΔης感到困惑,那么可能与您使用
shmget
&朋友有关。我对这个API不太了解,所以在这方面我帮不了你。