添加数组元素的总和给出了错误的输出?

时间:2013-05-02 14:37:13

标签: c arrays unix shared-memory

我使用共享内存使用两个不同的子进程添加数组的元素,但输出没有错。而且我遇到了分段错误。

 int main()
{
int a[100],i,k,s1=0,s2=0,lim=100;
int status1,status2;
pid_t pid1,pid2;
int perm=S_IRWXU|S_IRWXG|S_IRWXO;
int fd=shmget(IPC_PRIVATE,1024,IPC_CREAT|perm);
if(fd<0)
{
    printf("error");
    _exit(0);
}
 int* sum=(int*)shmat(fd,NULL,0);
if(*sum==-1)
{
    printf("error\n");  
    _exit(0);
}
*sum=0;

for(i=0;i<lim;i++)
{
a[i]=i;
    }


if((pid1=fork())==0)
{
    for(i=1;i<lim;i+=2)
    {
    s1 += a[i];
    }
    exit(s1);
}
else if((pid2=fork())==0)
{
    for(i=0;i<lim;i+=2)
    {
    s2+= a[i];
    }
    exit(s2);
}
else 
{
    printf("the elements of array are\n");
    for(i=0;i<lim;i++)
    printf("%d\t",a[i]);

    waitpid(pid1, &status1, 0);
    *sum = *sum+WEXITSTATUS(status1);
    waitpid(pid2, &status2, 0);
    *sum = *sum+ WEXITSTATUS(status2);

    printf("\nSum of all members of the array: %d\n", *sum);
}
return 0;
 }

这给了我一个输出:数组所有成员的总和:342 为什么呢?

1 个答案:

答案 0 :(得分:1)

int a[10],i,k,s1=0,s2=0,lim=100;

然后

for(i=0;i<lim;i++)
{
    a[i]=i;
}

您正在数组范围外编写(并在子项中读取),调用未定义的行为。试图进一步解释结果是毫无意义的。

在修复之后,你仍然没有得到正确的结果,显而易见的原因是你尝试传输部分和

exit(s1);

标准第7.22.4.4节中exit()的规范说:

  

最后,控制权返回给主机环境。如果status的值为零或EXIT_SUCCESS,则返回状态成功终止的实现定义形式。如果status的值为EXIT_FAILURE,则返回状态为不成功终止的实现定义形式。 否则返回的状态是实现定义的。

一个常见的事情是只使用0到255范围内的退出状态,并且

Prelude> sum [1, 3 .. 99]
2500
Prelude> 2500 `mod` 256
196
Prelude> sum [0, 2 .. 99]
2450
Prelude> 2450 `mod` 256
146
Prelude> 196 + 146
342

你的结果是模256的部分和的余数之和。