分段故障11尝试在使用memcpy后获取数据

分段故障11尝试在使用memcpy后获取数据,c,C,使用/a.out命令运行a.out文件时遇到问题。我得到了分段代码错误号11。尝试访问sharedMemory时出现分段错误。我使用memcpy将数据粘贴到共享内存中。这是故障11 我是否正确访问内存 #include<stdio.h> #include<sys/types.h> #include<sys/shm.h> #include<sys/ipc.h> #include<unistd.h> #include<time.h&g

使用
/a.out
命令运行
a.out
文件时遇到问题。我得到了分段代码错误号11。尝试访问sharedMemory时出现分段错误。我使用
memcpy
将数据粘贴到共享内存中。这是故障11

我是否正确访问内存

#include<stdio.h>
#include<sys/types.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<unistd.h>
#include<time.h>
int main(){
    pid_t childPid;
    childPid = fork();
    char *shm;
    if(childPid == 0){
        char *args[] ={"ls","-l",NULL};
        int shmid;
        int shsize = 100;
        key_t key;
        char *s;
        key = 9876;
        shmid = shmget(key,shsize, IPC_CREAT | 0666);
        if(shmid < 0){
            printf("error getting shmid");
            exit(1);
        }

        shm = shmat(shmid,NULL,0);
        if(shm == (char *) -1){
            printf("error getting shared memory");
            exit(1);
        }
        time_t startTime;
        gettimeofday(&startTime,0);
        memcpy(shm,&startTime,sizeof(startTime));
        time_t endTime;
        execvp(args[0],args);
        printf("successfuly created child proceess");
        exit(0);
    }

    else if (childPid <0){
        printf("unsuccessfuly created child proccess");



        else{
            int returnStatus;
            waitpid(childPid,&returnStatus,0);
            if(returnStatus == 0){
                printf("The child terminated normally");
                printf("%s",*shm);
            }

            if(returnStatus == 1){

                printf("The child terminated with error");
            }
        }

    }
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
pid_t childPid;
childPid=fork();
char*shm;
if(childPid==0){
char*args[]={“ls”,“-l”,NULL};
int shmid;
int shsize=100;
钥匙(t)钥匙;;
char*s;
密钥=9876;
shmid=shmget(键、shsize、IPC|U CREAT|0666);
如果(shmid<0){
printf(“获取shmid时出错”);
出口(1);
}
shm=shmat(shmid,NULL,0);
如果(shm==(字符*)-1){
printf(“获取共享内存时出错”);
出口(1);
}
时间开始时间;
gettimeofday(&startTime,0);
memcpy(shm和startTime、sizeof(startTime));
时间结束时间;
execvp(args[0],args);
printf(“成功创建子进程”);
出口(0);
}
如果(childPidIn

gettimeofday的第一个参数必须是
struct timeval*
而不是
time*

所以


您不能取消对shm的引用,因为当前它的第一个字符的ascii码用作字符串的地址,必须是

char *shm;
...
printf("%s",shm);

之后

else if (childPid <0){
    printf("unsuccessfuly created child proccess");

else if(childPid)此代码不可编译。请发布真实代码。同时消除所有警告(使用-Wall编译)。添加
#include
#include
#include
,这将消除一些警告,并显示一些与您的问题更相关的其他警告。您对我的回答和上面的评论没有反应,这对您没有用?我只是回答了您的其他问题,我可能会再次失去时间,因为您是也没有被问过吗?
char *shm;
...
printf("%s",*shm);
char *shm;
...
printf("%s",shm);
else if (childPid <0){
    printf("unsuccessfuly created child proccess");