0

저는 (코드에서 알 수 있듯이) C++을 처음 사용하고 포인터와 배열뿐만 아니라 내 구조로 동적 메모리 할당을 연습하고 있습니다. "growArray"함수에 액세스 할 때까지 내 코드가 제대로 작동하고 SIGSEGV 오류가 발생합니다. 왜 포인터를 포인터에 올바르게 전달할 수 있는지 알 수 없기 때문에 왜 새로운 포인터를위한 공간을 할당했는지 알 수는 없습니다. 내 구조에 문제가 있습니까, 아니면 포인터를 전달하는 데 문제가 있습니까? 아니면 포인터를받는 데 문제가 있습니까? 질문이 의미가 있기를 바랍니다.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; 
} 
+0

필수 질문에 도달 한 후 - 왜 사용하지 않는' std :: vector'? – PaulMcKenzie

+2

@PaulMcKenzie : 그는 매뉴얼을 운전하는 법을 배우고 있기 때문에? – Deduplicator

+0

그는 구체적으로 그가 DMA를 연습하고 있다고 말했습니다 :) –

답변

3

귀하의 문제는 당신이 p_entry 초기 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; 
} 
0

당신이 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; 
}