new int [10] [3]에서 int ** 포인터로 return을 캐스팅 할 때이를 사용하는 프로그램은 다음을 출력합니다. Segmentation fault : 11?

Al2O3

이 프로그램이 출력하는 이유 : 분할 오류 : 11

#include <iostream>
using namespace std;
int main(){
    int **a = (int**)new int[10][3];
    a[0][0] = 1; a[0][1] = 2; a[0][2] = 3;
    cout << a[0][0] << "," << a[0][1] << "," << a[0][2];
    return 0;
}
Vlad / 모스크바

이 선언 변경

int **a = (int**)new int[10][3];

...에

int ( *a )[3] = new int[10][3];

그렇지 않으면 new 연산자가 반환 한 포인터 int **int ( *a )[3]호환되지 않습니다.

문제는 타입 a[0]있을 때 컴파일러가 할당 된 초기화되지 않은 메모리를 타입의 포인터의 유효한 값으로 읽으려고한다는 것 입니다.aint **int *

또한 프로그램 끝에서 포인터를 삭제해야합니다.

delete [] a;

또 다른 접근 방식은 다음과 같습니다.

int **a = new int * [10];

for ( size_t i = 0; i < 10; i++ ) a[i] = new int[3];

이 경우 할당 된 메모리는 다음과 같은 방법으로 해제됩니다.

for ( size_t i = 0; i < 10; i++ ) delete [] a[i];
delete [] a;

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관