Linux下共享内存创建int向量后printf出现格式类型不匹配警告
问题分析与解决
核心错误
你的代码存在两个关键问题:
- 变量类型定义错误:
int *vectorR[tamR];定义的是一个存储int指针的数组,而非你需要的int类型向量。 - 数组越界访问:
vectorR[tamR] = ...中,数组下标合法范围是0到tamR-1,tamR已经超出数组索引边界,会触发未定义行为。
修正后的代码
1. 正确创建共享内存指向的int向量
将vectorR定义为单个int指针,直接指向共享内存的起始地址:
int shmidR, tamR; tamR = fil*col2; // 定义为int类型指针,而非指针数组 int *vectorR; shmidR = shmget(IPC_PRIVATE, sizeof(int)*fil*col2, IPC_CREAT|0666); // 让vectorR指向共享内存的起始位置 vectorR = (int*) shmat(shmidR, NULL, 0);
2. 正确打印向量内容
此时vectorR[i]就是int类型的值,直接用%i格式符打印即可:
for (int i = 0; i < tamR; i++) { printf("%i ", vectorR[i]); // 加空格分隔,方便查看结果 } printf("\n"); // 打印完成后换行
额外注意事项
- 使用完共享内存后,需调用
shmdt(vectorR)脱离共享内存,再调用shmctl(shmidR, IPC_RMID, NULL)删除共享内存段,避免内存泄漏。 - 确保
fil和col2为合法正整数,防止tamR为0引发异常。
内容的提问来源于stack exchange,提问作者user18559097
相关产品推荐
相关产品推荐

