C语言使用memcpy后打印整数数组及mmap强制转换失败求助
问题修复方案
核心问题梳理
- 存在未定义变量:代码中
num、pid、fd三个变量未声明初始化,匿名共享映射要求fd参数传入-1,num需要设置为共享内存的总字节数(存储3个int则为3*sizeof(int)),pid需要声明为pid_t类型。 - memcpy长度参数错误:memcpy第三个参数为拷贝的字节数,原代码写
num+1仅能拷贝极少字节,无法完整复制整个整数数组,应传入数组总大小如sizeof(shared)。 - 打印逻辑不符合预期:
src是void*类型的指针,直接传入printf的%d占位符会因类型不匹配导致编译失败,直接打印指针只会输出内存地址,需要先将src强转为int*类型,再遍历读取每个元素的值打印。 - 进程逻辑存在缺陷:fork生成的子进程没有退出逻辑,会重复执行循环生成多余进程,且子进程写入的本地
shared数组属于子进程私有地址空间,父进程无法读取到子进程写入的pid值,建议直接操作共享内存存储pid。
修正后的可运行代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/wait.h> #include <sys/mman.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #define ARRAY_LEN 3 // 自定义要存储的pid数量 int main(int argc, char const *argv[]) { pid_t pid; // 计算共享内存总大小 size_t num = ARRAY_LEN * sizeof(int); // 匿名共享映射,fd固定传-1 void* src = mmap(NULL, num, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_SHARED, -1, 0); if (src == MAP_FAILED) { fprintf(stderr, "mmap() failed\n"); exit(EXIT_FAILURE); } for(int i = 0; i < ARRAY_LEN; i++) { if ((pid = fork()) < 0) { perror("fork error"); exit(EXIT_FAILURE); } else if (pid == 0) { // 子进程直接写入共享内存 ((int*)src)[i] = getpid(); // 子进程执行完成直接退出,避免重复fork exit(EXIT_SUCCESS); } // 父进程等待子进程写入完成 wait(NULL); } // 强转为int*后遍历打印数组元素 int *shared_arr = (int*)src; for(int i=0; i<ARRAY_LEN; i++){ printf("第%d个进程pid:%d\n", i+1, shared_arr[i]); } // 释放共享内存 munmap(src, num); return 0; }
效果说明
代码运行后会依次输出对应数量的子进程pid值,可正常打印共享内存中存储的整数数组。
内容的提问来源于stack exchange,提问作者lst
相关产品推荐
相关产品推荐

