C UBUNTU在VMWARE上出现分段故障(内核转储)

C UBUNTU在VMWARE上出现分段故障(内核转储),c,linux,ubuntu,vmware,C,Linux,Ubuntu,Vmware,对不起,如果我的英语很糟糕:我真的很紧张:( 我正在使用Ubuntu 11.04作为虚拟机。使用VMWARE作为虚拟机的操作系统是windows 7。 我正试图在linux上用C语言编写一个程序:使用共享内存。当我试图编译时没有错误,但当我执行它时,我看到一个类似这样的错误: 分段故障(堆芯转储) 我不确定,但据我所知,VMWARE导致了以下情况:S 代码如下: #include<stdio.h> #include<sys/wait.h> //Process wai

对不起,如果我的英语很糟糕:我真的很紧张:( 我正在使用Ubuntu 11.04作为虚拟机。使用VMWARE作为虚拟机的操作系统是windows 7。 我正试图在linux上用C语言编写一个程序:使用共享内存。当我试图编译时没有错误,但当我执行它时,我看到一个类似这样的错误: 分段故障(堆芯转储) 我不确定,但据我所知,VMWARE导致了以下情况:S 代码如下:

#include<stdio.h>
#include<sys/wait.h>    //Process wait
#include <fcntl.h>  //File
//#include <cstdlib>
//#include<fstream.h>

int main(){

  printf("\n Here we go...!");
  int *Numbers;
  Numbers=(int*)getmem(327); // shared memory

  int i,ProcID;
  ProcID=fork(); //depart processor

  if(ProcID==0){          // child processor
    for(i=0;i<50;i++){
      Numbers[i]=random()%50;   
    }
  }else if(ProcID<0){
    printf("\n Hmm... There is an error!");
  }

  int Waiting;
  wait(&Waiting);   

  if(ProcID>0){          // parent processor

    int fileeven,fileodd;
    fileeven=open("EK_even.txt",O_RDWR|O_CREAT,0600);
    fileodd=open("EK_odd.txt",O_RDWR|O_CREAT,0600);

    for(i=0;i<50;i++){
      if(Numbers[i]%2==0){
    write(fileeven,&Numbers[i],sizeof(Numbers[i]));
      }else{
    write(fileodd,&Numbers[i],sizeof(Numbers[i]));
      }
    }

    close(fileeven);
    close(fileodd);

  }else if(ProcID<0){
    printf("\n Hmm... There is an error!");
  }
  return 1;
}
#包括
#包含//进程等待
#包含//文件
//#包括
//#包括
int main(){
printf(“\n我们开始…!”);
整数*数字;
Numbers=(int*)getmem(327);//共享内存
inti,ProcID;
ProcID=fork();//离开处理器
如果(ProcID==0){//子处理器

对于(i=0;i假设
getmem
将字节数作为参数,则为数字数组分配327个字节:

Numbers=(int*)getmem(327);
如果您在一个具有8字节
int
的64位系统上,这足够容纳40个整数

然后,您继续在该数组中放入50个数字,超出了分配的空间。这很可能会导致分段错误


通常,在调试器中启动程序以查看分段错误的确切发生位置。这样,您可以更轻松地在程序中定位错误。

假设
getmem
将字节数作为参数,则为数字数组分配327个字节:

Numbers=(int*)getmem(327);
如果您在一个具有8字节
int
的64位系统上,这足够容纳40个整数

然后,您继续在该数组中放入50个数字,超出了分配的空间。这很可能会导致分段错误


通常,在调试器中启动程序以查看分段错误的确切发生位置。这样,您可以更轻松地找到程序中的错误。

正如Marc B所说,问题在于VMWare。我在真实的操作系统上尝试了它,它起了作用。getmem()函数不是我自己的函数。要使用它,必须添加“-shared”在编译行的末尾。感谢您的回复…

正如Marc B所说,问题在于VMWare。我在一个真实的操作系统上试用了它,它成功了。getmem()函数不是我自己的函数。要使用它,您必须添加“-shared”在编译行的末尾。感谢您的回复…

对于VMware来说,出现这样的错误是非常奇怪的。显然,请在“真实”的基础上尝试代码Linux安装未在VMware下运行,有待确认。更有可能的情况是,您的代码中有一个bug。thx如果可行,我将尝试此方法。我会让您知道……这是程序中的一个bug,不是VMware的错误。您应该发布getmem()函数。您可能应该检查它是否失败。open()也是如此调用时,它们可能会失败。如果我没有任何想法(尽管这一点很明显,正如sth所指出的),我的第一个操作将是在Valgrind下运行我的程序:)…无需麻烦且轻松地跟踪错误。VMware会导致这样的错误,这将是非常奇怪的。显然,请在“真实”环境下尝试代码Linux安装未在VMware下运行,有待确认。更有可能的情况是,您的代码中有一个bug。thx如果可行,我将尝试此方法。我会让您知道……这是程序中的一个bug,不是VMware的错误。您应该发布getmem()函数。您可能应该检查它是否失败。open()也是如此如果我没有任何想法(尽管这一点很明显,正如sth所指出的),我的第一个行动就是在Valgrind下运行我的程序:)…无需麻烦且轻松地跟踪bug。