2014-05-20 1 views
0

포인터 :초기화되지 않은 값 - 나는 현재 내 프로그램을 확인 Valgrind의를 사용하고, 소정의 시험 프로그램은 나에게 내가 이해할 수없는 오류가 준

int size=10; 
int i; 

float * v1; 
v1=new float[size]; 

float v2[size]; 

for (i=0;i<size;i++) v1[i]=0; 
for (i=0;i<size;i++) v2[i]=0; 

v1[0]=1; 
v2[0]=1; 

v2에서 잘 작동하지만 V1은 조건부 점프를 제공을 또는 이동은 valgrind에서 초기화되지 않은 값 오류에 달려 있습니다.

왜 이런 일이 발생합니까? 또한 위의 v2 에서처럼 배열을 사용하는 것이 가장 좋은 방법입니까 아니면 동일하게 사용합니까?

미리 감사드립니다. 편집

은 : 코드의 나머지 부분을 추가 - 오류가

v1=new float[size]; 
for (i=0;i<size;i++) v1[i]=0; 
v1[0]=1; 
+0

valgrind는 모든 경우에 스택 할당 메모리를 추적하지 않습니다. v2에서 동일한 오류가 발생할 수 있지만 valgrind는이를보고 할 수 없습니다. 또한 valgrind 출력과 valgrind가 불평하는 코드 행을 표시하십시오. valgrind는 여기 몇 줄의 코드에 대해 불평해서는 안되기 때문에 더 많은 코드가 있습니다. – nos

+0

초기화되지 않은 변수가 _error_를주는 이유는 무엇입니까? –

+0

'v1 []'의 * member * (그리고 아마도'v2 []'와 마찬가지로 nos가 초기화됩니다)는 초기화되지 않았습니다. 'v1 = new float [size] = {0.0};'또는 유사하게 사용하십시오. Valgrind가 당신의 논리에 대해 옳고 그곳에 숨겨져있는 더 깊은 버그를 가지고있을 가능성이 높기 때문에'v1 []'을 읽는'물건을 만드십시오. ' – Jeff

답변

0

왜 이런 일이 발생합니까?

아마도 초기화하기 전에 메모리를 읽었을 것입니다.

편집 : 추가 한 코드에 따라 초기화 전에 메모리를 읽지 않습니다. valgrind가 편집증 일 뿐이며 오류는 거짓 긍정입니다. 모든 요소를 ​​동일한 값으로 설정하려면 값 초기화를 사용하는 것이 더 간단 할 것입니다.

또한, 오류가없는 네,하지만 때문에

위의 V2와 같이 배열을 사용하는 것이 좋습니다. 초기화되지 않은 스택 메모리 읽기는 초기화되지 않은 동적 메모리 읽기와 마찬가지로 잘못되었습니다.

일반적으로 자동 저장 기간이있는 변수가 동적 저장 기간이있는 변수보다 우선합니다. 어레이가 거대하지 않은 한, 중요한 스택 공간을 사용하지 않으려 고합니다. 또는 size이 컴파일 타임 상수가 아닌 경우 스택에 할당 할 수 없습니다.

1

에 당신은 동적 (V1)에 대한 메모리를 할당했지만 그것을 초기화되지 않았다 나타납니다. 이 시점에서 무엇이든 포함 할 수 있습니다.