2012-11-10 80 views
1

一如既往地感谢您的时间和帮助!不知道这里发生了什么,但它可能是明显的,所以我想我会让其他人看看。偶尔的分段错误

这是我的代码。现在运行找到具有指定名称的节点的地址作为字符串。然后返回这个节点对象的地址。有时它可以正常工作(大部分),但其他运行给我一个分段错误。任何人都能看到为什么

class ManipulateArray 
{ 
    public: 
    Node* formArray(); 
    Node* findMemAddress(string); 
    private: 
    GetFileInfo g; 
}; 

Node* ManipulateArray::formArray() 
{ 
    Node *list = new Node[48]; 
    string null = "*"; 

    for(int i = 0; i<48; i++) 
    { 
     for(int j = 0; j<6; j++) 
     { 
     string info = g.returnInfo(i,j); 

      switch(j) 
       { 
      case 0: 
      list[i].setNodeName(info); 
      break; 
      case 1: 
      if(info.compare(null) == 0) 
      {list[i].getAttachedNode(j) = 0;} 
      break; 
       } 
     } 
    } 

    return list; 
} 

Node* ManipulateArray::findMemAddress(string nodeName) 
{ 
    Node* memoryAddress = 0; 
    Node* temp; 
    for(int i = 0; i<48; i++) 
    { 
     string name = temp[i].getNodeName(); 
     temp = formArray(); 

     if(name.compare(nodeName) == 0) 
     { 
      memoryAddress = &temp[i]; 
      break; 
     } 
    } 
    return memoryAddress; 
} 


int main() 
{ 
    ManipulateArray z; 
    //Node *start; 
    //Node *finish; 

    Node* start; 
    start = z.findMemAddress("F1"); 
    cout << start->getNodeName(); 
} 
+1

这是你的问题:http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope。它不一致的原因是它会导致未定义的行为。 – chris

+0

你能否确定seg故障发生在哪条线上?你有没有访问调试器?你有没有试过对代码行进行评论以查看看起来有什么作用/什么崩溃? –

+0

是的,我有。问题出在findMemAddress()中,当我在main中调用它的时候会导致这个问题。 – TheNodeCommode

回答

1
在功能 Node* ManipulateArray::findMemAddress(string nodeName)

'临时' 没有被初始化。 而在函数int main()中,您应该在取消引用之前检查'start'的值。希望它可行!

+0

是的,我只是在做这个测试输出。我感谢所有帮助人。问题虽然,我觉得我很快就会超越这个观点。为什么临时需要在堆上?温度的内容不会改变,为什么每次运行的结果都不一样?因为每次都选择不同的内存位置? – TheNodeCommode

+0

[解释为堆。](http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap) – prehistoricpenguin

+0

请粘贴你完整的代码在网站上,如[pastebin](http ://pastebin.com/)并给你的链接。 – prehistoricpenguin