2010-08-17 118 views
3

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

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给我带来了麻烦,而且......我的手对上帝......我没有改变一件事,并开始工作。我几乎想知道这是否可能依赖于环境?

回答

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

+0

为什么它会在spawn_process_b中工作?而且它确实在工作......被调用的附加进程会将结果输出到屏幕上,以证明它正在获取值。 – rybosome 2010-08-17 21:04:17

+0

这适用于两段代码。 'char * argv [2]'分配两个指针的数组,但不初始化任何一个指针。 – Thanatos 2010-08-17 21:04:30

+0

@Ryan:你幸运。这是未定义的行为 - 它可能工作,它可能不会,取决于当前的内存状态。 – Thanatos 2010-08-17 21:05:11

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 
1

argv[0]argv[1]字符指针需要指向的东西,是初始化。