繁体   English   中英

在C ++中指向结构数组的指针有麻烦

[英]Trouble with a Pointer to an Array of Structures in C++

我的任务是使用结构将猪拉丁语翻译成英语。 到目前为止,我的项目接收一个字符串,删除所有大写字母,除末尾标点符号外的所有标点符号,并将字符串拆分成由单词组成的结构数组。 然后,我应该通过具体的return语句,返回指向我的结构数组的指针。 回到main时,我想创建另一个结构数组,该结构与我的pigLat函数中的结构相同,可以将其发送到项目第二部分的新函数中(这包括将猪拉丁语翻译成英语) 。

问题:尝试使用指针创建新数组会导致核心分段错误。

任何帮助解释为什么它不起作用,并解释可能更好的方法将不胜感激!

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
using namespace std;

struct Word                                           //Variable type to hold each word
{
    string piglatin;
    string english;
};

Word *pigLat(int &);

int main()
{
    int size;                                      
    Word *phrase;
    phrase = pigLat(size);                //Passes value of size by reference, and returns ptr to structure
    Word pigSent[size];

    //THIS IS WHERE I GET SEGMENTATION FAULT************************************
    for (int count = 0; count < size; count++)
    {
        pigSent[count].piglatin = phrase[count].piglatin;
    }
     //*************************************************************************
    return 0;
}

//Receives a phrase in pig latin, finds # of words in phrase, seperates pig  latin from english, returns pig latin
Word *pigLat(int &sizeOf)
{
    string phrase;                                  //Variable to hold pig latin phrase 

    cout << "Enter a phrase in pig latin: ";        //User enters pig latin   phrase
    getline(cin, phrase);

    char punctuation = phrase[phrase.length() - 1]; //Assumes last char is punctuation, and saves it

    //Removes all characters besides last period
    char removch[] = "&,'?.!-";
    for (int count = 0; count < 7; count++)
    {
        phrase.erase(remove(phrase.begin(), phrase.end(), removch[count]),  phrase.end());
    }

    int length = phrase.length();                   //Number of elements in updated string
    phrase.insert(length, 1, punctuation);          //Inserts final punctuation at end of phrase

    //Removes all capitalization
    for (int count = 0; count < length; count++)
    {
        if(phrase[count] >= 'A' && phrase[count] <= 'Z')
        {
        phrase[count] = tolower(phrase[count]);
        }
    }

    int index = 0;
    int count = 0;
    int *spaceElements = 0;
    spaceElements = new int[length];                //Dynamically allocates  spaceElements memory

    for (count; count < length; count++)            //Gives number of white spaces in phrase
    {
        if (phrase.find(' ', count) != -1)
        {
        int space = phrase.find(' ', count);
        count = space;
        spaceElements[index] = space;
        index++;

        }
    }
    sizeOf = (index + 1);
    Word sentence[sizeOf];
    int start = 0;
    int end = 0;
    count = 0;

    //Copies, word by word, into Word array sentence
    for (count; count < sizeOf; count++)
    {
        for (count; count < index; count++)
        {
            end = spaceElements[count] - start;
            sentence[count].piglatin = phrase.substr(start, end); 
            start = spaceElements[count] + 1;
        }
        sentence[count].piglatin = phrase.substr(start, length);
    }

    //Testing***************************************************
    for (count = 0; count < sizeOf; count++)
        cout << endl << sentence[count].piglatin << endl;
    //**********************************************************

    delete [] spaceElements;

    Word *ptrToSet = sentence;             //assigns pointer to memory address of sentence array

    return ptrToSet;
}

pigLat()函数实例化本地函数范围内的sentence

Word sentence[sizeOf];

PigLat()返回一个指向此数组第一个元素的指针:

Word *ptrToSet = sentence;
return ptrToSet;

但是,一旦pigLat()返回,则因为sentence是一个局部作用域的对象,它将超出范围并被销毁。 后续尝试取消对返回的指针的引用是未定义的行为。 这是您的应用程序崩溃的可能原因。 可能还有其他原因,我没有再看了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM