2013-11-26 1 views
0

문자열 배열을 만들고 포인터를 사용하여 수정하려고합니다. 나는 문자열이 길이가 다를 수 있기 때문에 포인터를 선언하는 방법을 잘 모르겠습니다, 그리고 이것이 오류의 원인이라고 생각합니다.동적으로 할당 된 문자열 배열을 변경 한 다음 값을 변경 하시겠습니까?

내 코드는 다음과 같은 :

#includes <string> 
#includes <iostream> 
using namespace std; 

string *users = NULL; 
int seatNum = NULL; 
cin >> seatNum; 
users = new string[seatNum]; 
string name; 
cin >> name; 
users[seatNum] = name; 

나는 그것의 값을 변경하려고 할 때 그것은 나에게 쓰기 액세스 위반이 발생합니다. 문자열을 읽기 전용으로 컴파일했기 때문에 읽은 것에서부터, 내 질문은 어떻게 내가/어떻게 변경해야합니까? 쉽게 이해할 수있는 설명이 바람직합니다.

+3

'users = new string [seatNum];''0 '에서'seatNum - 1'까지 색인 된 문자열의 배열을 생성하므로'users [seatNum]'는 배열의 경계를 넘어서 접근합니다. –

답변

3

넌 할당 어레이

users = new string[seatNum]; 
users[seatNum] = name; 

벗어난 메모리에 액세스하는 첫 번째 요소는 [0]. 마지막은 [seatNum-1]

+1

Doh, 나는 이것처럼 단순한 것을 간과 할 수 있을지 전혀 모른다. 가끔은 누군가에게 물어 보셔야 만합니다. 어쨌든 고마워요! – PeppeJ

0

몇 가지 :

  1. INT의 seatNum는 스택에 할당되며 NULL이 될하지 않습니다. 012로 설정해야합니다.

  2. 범위를 벗어난 [seatNum] 사용자가 프로그램을 중단 시키도록 설정 중입니다. 은 0부터 seatNum-1까지의 인덱스 만 사용할 수 있습니다.

업데이트 : Chris is correct. 나는 그것을 들여다 보았고 문자열은 실제로 C++에서 변경할 수 있습니다.

+1

마지막 점이 실제로 올바르지 않습니다. 문자열은 C++에서 변경할 수 있으므로 복사본을 만들 이유가 없습니다. 문제의 객체를 수정합니다. 그것이 포함 된 문자의 전체 복사본을 만드는 것이 다른지 여부입니다. – chris

1

seatNum 요소의 배열을 만들었습니다. 배열 요소 색인화는 0에서 시작하므로 유효 색인의 범위는 [0, seatNum - 1]입니다. users[seatNum] = ...에 액세스하면 효과적으로 배열의 마지막 유효 요소를지나 가게됩니다. 그러면 UB (정의되지 않은 동작)가 호출됩니다.


난 당신이 이미 C 스타일의 문자열 대신 std::string를 사용하는 올바른 선택을 한 참조하십시오. 배열에 대해 같은 선택을하는 것이 어떻습니까?

#include <string> 
#include <array> 
#include <iostream> 

int main(int, char*[]) { 
    int seatNum = 0; 
    std::cin >> seatNum; 
    std::vector<std::string> users(seatNum); 
    std::cin >> users[0]; 
    return 0; 
} 

포인터 및 C 스타일 배열, 특히 동적 배열을 피하십시오.