通过引用传递给char数组

时间:2020-09-29 11:59:16

标签: c pointers

这是我的代码。

int main(int  argc, char *argv[]) {
    int shmid;
    char *shmc;
    char *shmp;
    pid_t pid;


    shmid = shmget(IPC_PRIVATE, 3 * sizeof(char), 0666 | IPC_CREAT);    

    pid = fork();
    if (pid == 0) {
        shmc = (char *) shmat(shmid, NULL, 0);
        shmc[0] = argv[1];  
        shmc[1] = argv[2]; 
        shmc[2] = argv[3]; 
        
        shmdt(shmc);  
    }else{
        wait(NULL);

        shmp =(char*) shmat(shmid,NULL, 0);

        char *arg_vec[]={"./test", &shmp[1], &shmp[2],NULL};
        execv("./test", arg_vec);
        shmdt(shmp);
        shmctl(shmid, IPC_RMID, NULL);    
    }
}
        char *arg_vec[]={"./test", &shmp[1], &shmp[2],NULL};

在这一行中,我试图将2、3传递给另一个c程序。但是它通过了23和3。我想知道为什么以及如何解决该问题。任何帮助表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:2)

函数execv需要一个指向字符串的指针数组。您提供的内容与类型匹配,但与后面的逻辑不匹配:

char *arg_vec[]={"./test", &shmp[1], &shmp[2],NULL};

用于初始化参数数组的地址仅是指向单个char的指针,没有字符串。

shmp中,所有元素只有1个字节,并且它们位于连续的存储器地址中。没有一些终止0字节的地方可以使您的数组成为有效的字符串。

您需要提供并初始化更多空间: (假设您可以确保数字仅为1位数)

shmid = shmget(IPC_PRIVATE, 3 * sizeof(char[2]), 0666 | IPC_CREAT);

char (*shmc)[2] = shmat(shmid, NULL, 0);
sprintf(shmc[0], "%d", number[0]);
...
char (*shmp)[2] = shmat(shmid, NULL, 0);
printf("%s, %s\n",shmp[1], shmp[2]);
char *arg_vec[]={"./test", shmp[1], shmp[2], NULL};

我把它留给您,以确保适当的长度并在您需要更大数量的情况下进行调整。