簡體   English   中英

SIGSEGV,分段錯誤

[英]SIGSEGV, Segmentation fault

我是C ++的新手(從代碼中可以明顯看出),並且正在練習使用指針和數組以及結構進行動態內存分配。 我的代碼可以正常工作,直到它訪問“ growArray”函數,然后它給了我SIGSEGV錯誤。 我不知道為什么會這樣,因為據我所知我正在正確地將指針傳遞給指針,並且我還為新指針分配了空間。 是我的結構出現問題,還是傳遞指針出現問題,還是接收指針出現問題? 我希望這個問題有意義。

#include <iostream>
#include <string>

using namespace std;

struct FriendInfo
{
  string name;
  string address;
  string number;
};

FriendInfo *growArray(FriendInfo *p_entry, int *size);

int main()
{
    int curNum = 0;
    int size = 2;
    int userAnswer;
    FriendInfo *p_friends = new FriendInfo[size];

    cout << "Enter a friend's info?(1 for yes, 0 for no)\n";
    cin  >> userAnswer;
    while (userAnswer != 0)
    {
        if (curNum == size)
        {
            p_friends = growArray (p_friends, &size);
        }
        cout << "What is your friend's name?\n";
        cin  >> p_friends[curNum].name;
        cout << "What is your friend's address?\n";
        cin  >> p_friends[curNum].address;
        cout << "What is your friend's number?\n";
        cin  >> p_friends[curNum].number;
        curNum++;
        cout << "Enter another friend? (1 for yes, 0 for no)\n";
        cin  >> userAnswer;
    }
}

FriendInfo *growArray(FriendInfo *p_entry, int *size)
{
    *size *= 2;
    FriendInfo *p_new_friends = new FriendInfo[*size];
    for (int i = 0; i < *size; ++i)
    {
        p_new_friends[i] = p_entry[i];
    }
    delete [] p_entry;
    return p_new_friends;
}

您的問題是,即使p_entrysize為初始size ,您還是要將size的值加倍。 將代碼更新為此:

FriendInfo *growArray(FriendInfo *p_entry, int *size)
{
    int newSize = *size * 2;
    FriendInfo *p_new_friends = new FriendInfo[newSize];
    for (int i = 0; i < *size; ++i)
    {
        p_new_friends[i] = p_entry[i];
    }
    delete [] p_entry;
    *size = newSize;
    return p_new_friends;
}

在for循環中,您要在達到p_entry的大小(而不是大小)后停止

FriendInfo *growArray(FriendInfo *p_entry, int *size)
{
    int orig_size = *size;
    *size *= 2;
    FriendInfo *p_new_friends = new FriendInfo[*size];
    for (int i = 0; i < orig_size; ++i)
    {
        p_new_friends[i] = p_entry[i];
    }
    delete [] p_entry;
    return p_new_friends;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM