2010-01-21 3 views
3

동적으로 할당 된 정수 배열을 가리키고 고정 int [] 배열로 나타내는 int *를 어떻게 다이빙합니까? 그렇지 않으면, 만약 내가 int *를 보여 주면 주소와 int가 가리키는 것을 보여 주지만, 대신 모든 정수의 배열을보고 싶습니다.totalview에서 int *를 배열로 나타내는 방법은 무엇입니까?

+0

가 어떻게 그것이 얼마나 큰 알아? – danben

+0

수 없습니다. 배열에 대한 포인터가 아닌 std :: vector를 사용하는 다른 좋은 이유. –

답변

7

이 질문에 대한 TotalView 태그를 발견했습니다. totalview에서 배열의 값을 보는 방법을 묻고 있습니까? 그렇다면 대답은 꽤 쉽습니다.

int * 타입의 포인터 p가 있고 현재 10 개의 정수가있는 배열을 가리키고 있다고 가정 해 보겠습니다.

1 단계. 포인터를 잠수.이것은 소스 코드 창이나 스택 프레임 창에 변수 int에 마우스 커서를 올려 놓은 후 두 번 클릭하거나 가운데 마우스 단추를 클릭하거나 컨텍스트 메뉴에서 다이빙 옵션을 사용하여 수행 할 수 있습니다.

표현을 말할 것이다 새 창이 나타납니다 : P 주소 : 0xbfaa1234 유형 : INT *

을 아래로 데이터 영역에 말할 것

0x08059199 같은 - > 0x000001a5 (412)

이 창은 포인터 자체를 보여 주며 나열된 주소는 포인터의 주소입니다. 위의 예에서 값 (0x08059199)은 포인터에있는 실제 값입니다. 화살표 오른쪽에있는 모든 것은 그것이 가리키고 싶다는 것을 말하는 "힌트"일뿐입니다.

2 단계. 포인터를 다시 잠수십시오. 변수 창에서 데이터 값에 대해 더블 클릭 또는 마우스 가운데 버튼을 반복합니다. (그래서 당신은 그것이 0x08059199라고 말하는 곳을 더블 클릭합니다).

포인터를 효과적으로 "참조 해제"합니다. 이제 창은 포인터 자체가 아닌 포인터가 가리키는 점에 초점을 맞 춥니 다. 이제 주소 상자에 이전 값인 0x08059199가 포함됩니다.

식 : * (((INT *) P)) 주소 : 0x08059199 는 유형 :

아래로 데이터 영역에 말할 것을 int로 뭔가

0x000001a5 (412)와 같은

3 단계. 데이터 창을 원하는 유형으로 캐스팅하십시오. 유형 필드를 클릭하고 int [10]로 변경하십시오. 그럼 돌아 오라.

이것은 디버거에게 0x08059199가 10 개의 정수 배열의 시작임을 알립니다.

창이 슬라이스와 필터의 두 가지 새로운 필드로 커집니다. 지금은 그만 둘 수 있지만 나중에 유용 할 수 있습니다.

데이터 영역에는 이제 "필드"와 "값"의 두 열과 10 개의 행이 표시됩니다.

필드 열은 배열 [0] - [9]의 색인이되고 값 열은 각 배열 위치에있는 데이터를 알려줍니다.

다른 팁 :

  • 더 복잡한 데이터 구조에 당신이 (또는 포인터가 될 수있는, 다이빙뿐만 아니라 그 반 참조 것)

  • 개별 요소에 다이빙을 할 수 있습니다 당신은 항상 할 수 다른 유형이나 길이로 캐스팅하여 데이터를 "무엇이든지처럼"볼 수 있습니다.

  • 값 열을 클릭하고 거기에서 발견 한 것을 편집하여 실제 데이터 값을 편집 할 수 있습니다.응용 프로그램에서 특정 동작이 잘못 될 경우 유용합니다.

  • 변수 창의 오른쪽 위 모서리에있는 "<"아이콘을 사용하여 언제든지 다이빙 작업을 실행 취소 할 수 있습니다.

는 "TotalView 시작하기를"이라는 하나가 당신이 특히

http://www.roguewave.com/products/totalview/resources/videos.aspx

에 도움이 될 수있는 일부 온라인 비디오가 있습니다.

Rogue Wave Software에서 TotalView 사용 팁을 주저하지 마십시오! roguewave dot com에서 을 지원하는 것이 좋습니다.

크리스 Gottbrath (크리스 도트 Gottbrath roguewave 닷컴에서) 로그 웨이브 소프트웨어에서 TotalView 제품 관리자

0

매우 어렵지는 않지만 정확하게 작동하는 것을 잊어 버렸습니다. 나는 당신에게 그걸 설명하는 페이지를 발견했다;). 내가 가리킨 생각 ints와 배열 예를 들어, 테스트를 사용하여 & 테스트를 사용하여 전화를해야한다고 생각합니다. 그냥이 페이지를 체크 아웃 :

http://www.cplusplus.com/doc/tutorial/pointers/

0

당신은 의미있는 많은의 int 배열에 정확히 모르는 상태에서이 작업을 수행 할 수 없습니다.

-2

당신은 할 경우 배열처럼 중 동적으로 할당하거나 정적 배열, 당신이 인덱스를 할 수있는, 연속 int 데이터의 첫 번째 요소를 가리키는 int *p : 당신은이

int *data = malloc(3 * sizeof *data); 
int *p; 
/* malloc error detection omitted for brevity */ 
data[0] = 1; 
data[1] = 2; 
data[3] = 42; 

p = data; 
assert(p[0] == 1); 
assert(p[1] == 2); 
assert(p[2] == 42); 

이 방법으로 액세스하는 유효한 데이터의 크기를 알 수 있습니다.

위와 같이 data이 있고이를 인쇄하는 함수를 작성한다고 가정 해 보겠습니다. 그것은 다음과 같은 기능을 선언하지 않을 것이다 :

void print_array(int *data); 

print_array(data);를 호출 할 때하기 때문에,이 함수는 인쇄 할 요소의 수를 알 수 없습니다.

당신은 정의 할 수 있습니다 귀하의 print_array() 같은 : n는 호출자가 제공하는 것으로, 유효한 요소의 수는 data가 가리키는 의미

void print_array(int *data, size_t n); 

.

다음
data[2] = 0; /* data[0] and data[1] are useful, valid values 
       and data[2] is 0 to signify the end of the data */ 

당신이로 print_array()을 선언 할 수있다 또는 당신은 모든 "배열"센티넬 값, 데이터의 끝 부분에만 사용되는 값으로 종료됩니다, 유용한 값이 다른 아니라고 결정할 수 :

void print_array(int *data); 

그리고 당신은 감시 공격까지 함수 정의에 data에 색인을 유지 :

void print_array(int *data) 
{ 
    size_t i; 
    for (i=0; data[i] != 0; ++i) 
     printf("%d\n", data[i]); 
} 

그래서, 귀하의 질문에 대답하기를 , 동적으로 할당 된 유효한 데이터에 대한 포인터를 이미 배열로 취급 할 수 있습니다. 당연히 할당 된 데이터의 크기를 기억해야하는데, 이는 정규 배열에서도해야합니다.

관련 문제