c-通过对char数组的引用进行传递

  • 本文关键字:引用 数组 char 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。我想知道为什么以及如何解决这个问题。感谢您的帮助。非常感谢。

函数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, %sn",shmp[1], shmp[2]);
char *arg_vec[]={"./test", shmp[1], shmp[2], NULL};

我把它留给你,以确保合适的长度,并在你需要更大的数字时进行调整。

最新更新