如何解决通过引用传递给char数组
这是我的代码。
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,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",NULL};
在这一行中,我试图将2、3传递给另一个c程序。但是它通过了23和3。我想知道为什么以及如何解决该问题。任何帮助表示赞赏。谢谢。
解决方法
函数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,0);
printf("%s,%s\n",shmp[1],shmp[2]);
char *arg_vec[]={"./test",shmp[2],NULL};
我把它留给您,以确保适当的长度并在您需要更大数量的情况下进行调整。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。