C中出现奇怪的sprintf错误

时间:2010-08-17 21:00:50

标签: c

我正在调用一个函数,它将为我分支并执行另一个进程的代码。有多个进程,标记为B,C和D.我有几乎相同的代码用于创建不同的进程。由于某些奇怪的原因我无法发现,其中一个进程创建函数会导致分段错误。他们看起来和我一模一样。任何人都有可能权衡,也许能让我对这个问题有所了解吗?

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

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

    pid = fork();

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

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

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

    pid = fork();

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

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

3 个答案:

答案 0 :(得分:9)

argv[0]是未定义的指针,指向sprintf时未分配的存储空间。

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

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

你需要像

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

最后一行对execv

很重要

答案 1 :(得分:4)

你很幸运,其中一项功能确实奏效了。您正在做的是在两种情况下都是未定义的行为,因为您没有为要打印的字符串分配内存。

char *argv[2]只声明一个包含2个字符指针的数组,但它们没有任何意义。您需要先为它们分配内存,然后才能使用它们,或者静态地使用它们:

char argv[2][100]; // 2 strings of 100 characters each

或像这样动态:

char *argv[2];
int i;
for (i = 0; i < 2; i++)
  argv[i] = (char *)malloc(100 * sizeof(char)); // 100 characters

答案 2 :(得分:1)

您的argv[0]argv[1]字符指针需要指向某些内容并进行初始化。