정수의 동적 배열을 만드는 방법


84

new키워드를 사용하여 C ++에서 정수의 동적 배열을 만드는 방법은 무엇입니까?


11
당신은을 사용합니다 std::vector<int>. 그리고 .
GManNickG

초기화되면 데이터를 어떻게 할당하고 액세스합니까?

이 게시물을 살펴보십시오. 여기에서는 모든 종류의 데이터 유형에 대해 자세히 설명합니다. programmingtunes.com/dynamic-array-in-c
user2808359


quora.com/What-is-the-meaning-of-%E2%80%9Cint- * p-new-10- % E2 % 80 % 9D # : ~ : text = The % 20statement % 20defines % 20and % 20initializes, of % 20an % 20array % 20of % 20integers. & text = This % 20statement % 20will % 20dynamically % 20allocate, integers % 20from % 20the % 20heap ...
Nagappa

답변:


127
int main()
{
  int size;

  std::cin >> size;

  int *array = new int[size];

  delete [] array;

  return 0;
}

delete할당 하는 모든 어레이를 잊지 마십시오 new.


27
나는 -1을하지 않을 것이다. 그러나 당신이 잊을 수 있다면 delete, 당신의 코드는 잘못된 것이다.
GManNickG

2
8 년 후이 댓글은 @GManNickG 초보자를 혼란스럽게 할 수 있습니다. 삭제하는 것은 어떻습니까 (Jason Iverson이 실제로 어레이를 삭제하기 전에 만들어 졌다고 가정했기 때문입니다)?
gsamaras

2
@gsamaras : 혼란 스럽지만 여전히 정확하다는 데 동의합니다. 코드에 수동 삭제가 없어야하며 잊지 말아야합니다. 즉, 스마트 포인터 및 기타 컨테이너를 사용했습니다.
GManNickG

@GManNickG 나는 당신의 의견이 덜 독단적이라고 생각합니다. 이상적이지 않더라도 코드는 정확합니다. 스마트 포인터와 컨테이너는 거의 항상 더 나은 옵션이지만 (특히 이와 같은 초보자 질문에서) 항상 "항상"은 아닙니다.
Spencer

63

C ++ 11 이후로 다음 new[]delete[]달리 오버 헤드가 0 인 안전한 대안이 있습니다 std::vector.

std::unique_ptr<int[]> array(new int[size]);

C ++ 14에서 :

auto array = std::make_unique<int[]>(size);

위의 두 가지 모두 동일한 헤더 파일에 의존합니다. #include <memory>


나만 그런지는 모르겠지만 C ++ 11 구문은 정말 끔찍해 보입니다. C ++ 14가 훨씬 더 좋아 보입니다. 그런 다음 다시 C ++ 11 이전 이후로 따라 가지 않았습니다. 이 모든 새로운 표현을 기억하는 것은 어렵습니다.
Keya Kersting

28

표준 템플릿 라이브러리 사용을 고려할 수 있습니다. 간단하고 사용하기 쉬우 며 메모리 할당에 대해 걱정할 필요가 없습니다.

http://www.cplusplus.com/reference/stl/vector/vector/

int size = 5;                    // declare the size of the vector
vector<int> myvector(size, 0);   // create a vector to hold "size" int's
                                 // all initialized to zero
myvector[0] = 1234;              // assign values like a c++ array

18
좋습니다.하지만 실제 질문에 답하는 것도 좋습니다.
Ed S.

8
@Ed, 질문의 제한은 다소 임의적입니다. std::vector적절한 생성자는 정말 잘 작동하며 대안으로 지적해야합니다. 때때로 사람들은 질문을 제대로하지 않으며, 이는 이러한 경우 중 하나로 간주 될 수 있습니다. 매우 간단하고 선호에 대한 근거를 제공하지 않습니다 new.
Mark Ransom

3
@Ed : new[]대신 사용할 이유가 없습니다 std::vector.
GManNickG

2
@baash : C ++에서는 이유가 없습니다. 어떤 이유로 든 "표준 라이브러리를 제거"하기로 결정했다면 더 이상 C ++로 프로그래밍하지 않는 것입니다. 내 의견은 C ++ 언어에 대한 것이지 우리가 내 장치에서 사용하는 C ++ 언어가 아닙니다. 그렇더라도 delete수동으로 아무것도 할 필요가 없습니다 . 또한 std::vector동적 배열이며 연결된 목록으로 아무 작업도 수행하지 않습니다. 그것은 단지 메모리 덩어리를 감싸는 래퍼입니다.
GManNickG

1
@Montdidier : 아니요. 여전히 래퍼를 사용 new하고 delete구현합니다. 요점은 리소스를 관리 하고 사용 하지 않고 둘 중 하나를 수행한다는 것입니다.
GManNickG

6
int* array = new int[size];

2
그것은 단지 질문에 대한 대답입니다.
Ed S.

@GManNickG 벡터가 더 편리 할 수 ​​있기 때문에 또는 다른 이유로? 벡터 대신 배열을 사용해야하는 타사 함수를 자주 접하기 때문입니다.
Lèse majesté 2014

5
@ Lèsemajesté 벡터를 사용하지 않을 이유가 없습니다. std::vector::data()멤버 함수는 필요할 때 기본 원시 배열을 반환합니다.
emlai

3
@zenith : 일반적으로 벡터에서 포인터를 가져 오는 operator&대신 사용 data()하지만 배열이 필요한 함수와의 호환성에 필요한 연속성 보장을 벡터가 제공한다는 것은 사실입니다.
Ben Voigt

3

동적 배열에 대한 질문이 생기 자마자 가변 크기로 배열을 만들뿐만 아니라 런타임 중에 크기를 변경하기를 원할 수 있습니다. 여기에 예입니다 memcpy, 당신이 사용할 수있는 memcpy_sstd::copy뿐만 아니라. 컴파일러에 따라 <memory.h>또는 <string.h>필요할 수 있습니다. 이 기능을 사용할 때 새로운 메모리 영역을 할당하고 원래 메모리 영역의 값을 복사 한 다음 해제합니다.

//    create desired array dynamically
size_t length;
length = 100; //for example
int *array = new int[length];

//   now let's change is's size - e.g. add 50 new elements
size_t added = 50;
int *added_array = new int[added];

/*   
somehow set values to given arrays
*/ 

//    add elements to array
int* temp = new int[length + added];
memcpy(temp, array, length * sizeof(int));
memcpy(temp + length, added_array, added * sizeof(int));
delete[] array;
array = temp;

대신 상수 4를 사용할 수 있습니다 sizeof(int).


1

다음을 사용하여 일부 메모리를 동적으로 할당합니다 new.

int* array = new int[SIZE];

2
콜론이 누락되었거나 SIZE를 실제 크기 로 바꾸지 않았을 수 있습니다.
Montdidier

5
세미콜론이 있어야하는 이유는 무엇입니까? 완전한 진술이 아닙니다. 더 많은 선언이있을 수 있습니다. 이것은 완전한 프로그램에 포함되면 OP가 요청한 것을 수행합니다.
Benjamin Lindley

0
#include <stdio.h>
#include <cstring>
#include <iostream>

using namespace std;

int main()
{

    float arr[2095879];
    long k,i;
    char ch[100];
    k=0;

    do{
        cin>>ch;
        arr[k]=atof(ch);
        k++;
     }while(ch[0]=='0');

    cout<<"Array output"<<endl;
    for(i=0;i<k;i++){
        cout<<arr[i]<<endl;
    }

    return 0;
}

위의 코드는 작동하며 정의 할 수있는 최대 float 또는 int 배열 크기는 2095879 크기였으며 종료 조건은 입력 번호를 시작하는 0이 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.