C 将2d动态整数数组解析到共享内存
我试图建立一个程序,通过使用共享内存将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]
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不太了解,所以在这方面我帮不了你。