加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中出现奇怪的sprintf错误

发布时间:2020-12-16 10:39:58 所属栏目:百科 来源:网络整理
导读:我正在调用一个函数,它将为我分支并执行另一个进程的代码.有多个进程,标记为B,C和D.我有几乎相同的代码用于创建不同的进程.由于某些奇怪的原因我无法发现,其中一个进程创建函数会导致分段错误.他们看起来和我一模一样.任何人都有可能权衡,也许能让我对这个问
我正在调用一个函数,它将为我分支并执行另一个进程的代码.有多个进程,标记为B,C和D.我有几乎相同的代码用于创建不同的进程.由于某些奇怪的原因我无法发现,其中一个进程创建函数会导致分段错误.他们看起来和我一模一样.任何人都有可能权衡,也许能让我对这个问题有所了解吗?

void spawn_process_b(int fileID[]){
    int pid;
    char * argv[2];

    sprintf(argv[0],"%d",fileID[0]);
    sprintf(argv[1],fileID[1]);

    pid = fork();

    if (pid == 0)
    {
       execv("PipeW1",argv);
    }
}

void spawn_process_c(int fileID[]){
    int pid;
    char * argv[2];

    sprintf(argv[0],fileID[1]);

    pid = fork();

    if (pid == 0)
    {
       execv("PipeW2",argv);
    }
}

通过输入cout<<的断点“bp1”<< ENDL;等等,我发现spawn_process_b会执行得很好. spawn_process_c将进入,但在第一个sprintf指令处获得段错误.有人有主意吗?最初spawn_process_b给了我麻烦,而且...我的手给了上帝...我没有改变一件事,它开始工作了.我几乎想知道这是否可能依赖于环境?

解决方法

argv [0]是一个未定义的指针,指向sprintf时没有分配的存储空间.

当它完全奏效的时候,它是偶然的,你所潦草的记忆正好发生在你的过程空间里.

argv的自动声明为两个char *指针分配空间.指针可能充满了垃圾(也就是说,它们指向随机位置)并且没有分配空间来存储它们中的字符.

你需要类似的东西

char *argv[3];
for (int i = 0; i < 2; i++)
    argv[i] = malloc(space enough for my integer);
argv[2] = 0;

最后一行对execv来说很重要

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读