首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过引用字符数组传递

通过引用字符数组传递
EN

Stack Overflow用户
提问于 2020-09-29 19:59:17
回答 1查看 59关注 0票数 0

这是我的代码。

代码语言:javascript
复制
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);    
    }
}
代码语言:javascript
复制
        char *arg_vec[]={"./test", &shmp[1], &shmp[2],NULL};

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-29 21:03:53

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

代码语言:javascript
复制
char *arg_vec[]={"./test", &shmp[1], &shmp[2],NULL};

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

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

您需要提供并初始化更多的空格:(假设您可以确保数字只有1位)

代码语言:javascript
复制
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};

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64119159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档