You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:00:03