Linux编程:共享内存时,memset函数运行后报错Segmentation fault(core dumped)


#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>

char msg[] = "Hello world";

int main(void)
{
    int shmid;
    pid_t pid;

    shmid = shmget(IPC_PRIVATE, 1024, IPC_CREAT);

    pid = fork();

    if(pid > 0)
    {
        char *p_addr;
        p_addr = shmat(shmid, NULL, 0);

        memset(p_addr, '\0', sizeof(msg));
        memcpy(p_addr, msg, sizeof(msg));

        shmdt(p_addr);

        waitpid(pid, NULL, 0);
    }
    else if(pid == 0)
    {
        char *c_addr;
        c_addr = shmat(shmid, NULL, 0);

        printf("Child process waits a short time: \n");
        sleep(3);
        printf("Child Process reads from shared memory: %s\n", c_addr);
        shmdt(c_addr);
    }
    else
        perror("fork");

    return 0;
}

这是上面这段程序的运行结果:

img

我如果把menset、memcpy这两句函数注释掉,程序就可以正常运行了,但是因为注释掉了menset、memcpy函数,所以运行结果里也看不到打算写入共享内存里的内容。那怎么使用这两个函数才不会报错core dumped呢?