나는 새로운 C 프로그래머이고 포인터 + 배열은 나를 많이 망치고있다. 어떤 오류도 발생시키지 않고 코드가 제대로 실행됩니다 ... 중간에 코드가 작동하기 시작할 때까지 배열의 일부 요소가 원하는 것 이외의 다른 요소로 설정되기 때문에. 실행이 끝난 후 코드의 메모리를 시각화하는 프로그램이 있는지 알고 싶었습니다.C 코드에서 사용중인 메모리를 어떻게 확인합니까?
예컨대 I 후에 실행 : 그것은 배열 0과 4 개의 요소를 갖는 메모리 블록을 표시한다
#include<stdio.h>
int main(){
int array[2] = {0,1};
array[1] = 4;
printf("%d\n",array[1]);
}
.
지금 배열을 수행하여 내가 그 배열의 메모리를 취소 이전 작업의 요소를 포함하는 문제로 실행 피하기 위해 :
memset(tokenized,0,MAX_CHARS);
작동하는 것 같다,하지만 난 알고하지 않습니다 그 실제로 내가 백 엔드에서하고 있다고 생각하는 것을 수행합니다.
편집 : 지금 Valgrind를 사용하고 있는데 알고 싶습니다. 오류가 어떤 라인을 나타내는 지 어떻게 알 수 있습니까? 나는이있어 예를 들어 :
==24394== Source and destination overlap in strncpy(0x7ff000006, 0x7ff000006, 6)
==24394== at 0x4C2C236: strncpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24394== by 0x400D8A: tokenize_quotes (in /home/zee/Documents/seng265/repos/assignment2/a.out)
==24394== by 0x40184E: main (in /home/zee/Documents/seng265/repos/assignment2/a.out)
==24394==
==24394== Conditional jump or move depends on uninitialised value(s)
==24394== at 0x4C2C007: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24394== by 0x400E06: tokenize_quotes (in /home/zee/Documents/seng265/repos/assignment2/a.out)
==24394== by 0x40184E: main (in /home/zee/Documents/seng265/repos/assignment2/a.out)
==24394==
을하지만 모르는 오류가가 뭔지 라인? 나는 strcpy에 관해 그것의 무엇인가를 안다 고마워!
당신은 쉽게 디버거를 사용하여 확인하고 토큰 화 '에 어떤 임의의 항목을 확인할 수 있습니다 ''memset' 호출 전과 후에. –
나는 항상 다음과 같이 valgrind를 실행합니다. valgrind -v --tool = memcheck --leak-check = full --show-reachable = yes. 항상 줄 번호를 표시하므로 도움이됩니다 (어떤 명령 스위치가 내 스크립트에서 복사했는지 기억하지 못합니다). –
Wookie88
'-g'로 코드를 컴파일하여 컴파일러가 디버깅 정보도 생성하도록하십시오. 'Valgrind'와'gdb'와 같은 도구는이 정보를 사용하여 가상 주소를 소스 코드의 줄에 매핑 할 수 있습니다. –