c ++代码中的错误指针错误

时间:2015-01-15 15:55:28

标签: c++ arrays pointers

以下是将顶点添加到图表的代码:

void myGraph::addVertex(const string &newVertex)
{
    if (getIndex(newVertex) != -1)
    {
        std::cout << ("addVertex: ");
        std::cout << newVertex;
        std::cout << (" failed -- vertex already exists.") << std::endl;
        return;
    }

    // if array of vertices is full, we need to expand it and 
    // also expand Edges
    if (sizeof(Vertices)/sizeof(Vertices[0])==numVertices)
    {
        Vertices = resize(Vertices, 2*numVertices + 1);
        Edges = resize(Edges, 2*numVertices + 1);
    }

    Vertices[numVertices++] = newVertex;

}

以下是调整Vertices数组大小的代码:

string *myGraph::resize(string array1[], int newSize)
{

    // make array of size equal to new size
    string *temp = new string [newSize];
    int smallerSize = newSize;
    // if the size of input array is less than the new size then smaller size will be that of input array
    if (sizeof(array1)/sizeof(array1[0]) < smallerSize)
    {
        smallerSize = sizeof(array1) / sizeof(array1[0]);
    }
    // loop till smaller size and copy the content of input array to newly created array
    for (int i = 0; i < smallerSize; i++)
    {
        temp[i] = array1[i];
    }

    return temp;
}

当我调试这段代码时,它只添加了1个顶点,即numVertices = 1,并且在下一步中它在顶点[numVertices ++]中说明

2 个答案:

答案 0 :(得分:2)

sizeof给出了指向数组中数据的指针的大小,而不是数组的总大小。这取决于您的平台,但sizeof(string*)/sizeof(string)(相当于您的大小计算)总是会返回1.您可能应该使用类似std::vectorstd::list的内容这个,正确的选择取决于你将如何使用它。这些标准容器类将处理为您分配内存和调整大小,因此您不必担心它。

答案 1 :(得分:1)

您可以通过传递旧数组大小来修复它:

string *myGraph::resize(string array1[], int array1Size, int newSize)

然后:

if (array1Size < smallerSize) {
   smallerSize = array1Size ;
}

正如Katie所解释的那样,代码中的sizeof(array1)不是实际数组的大小,您应该使用string* array1来表明它是指向堆上已分配内存的指针