반응형
크기 8 - Valgrind + C의 잘못된 판독값
Valgrind가 오류를 보고합니다.Invalid read of size 8
아래와 같은 암호로
제게 이런 배열이 있다고 선언했어요
struct symbol *st[PARSER_HASH_SIZE];
내 프로그램이 초기화되면 이 배열의 모든 요소는 0으로 초기화됩니다.
memset(&st[0], 0, sizeof(st));
내 프로그램은 의 인스턴스를 만듭니다.struct symbol
해쉬 값에 따라 상기 배열에 삽입합니다.따라서 이 배열의 요소 중 NULL이 되는 요소는 거의 없고 다른 요소는 유효한 값이 됩니다.
다음 코드는 할당된 항목을 삭제하려고 하고 라인에서 valgrind 불만 사항을 제기합니다.sym = st[i]; sym != NULL; sym = sym->next
struct symbol *sym = NULL;
/* cleaning the symbol table entries */
for(i = 0; i < PARSER_HASH_SIZE; i++) {
for(sym = st[i]; sym != NULL; sym = sym->next) { /* <-- Valgrind complains here */
free(sym);
}
}
저는 이 오류의 이유를 이해하려고 합니다.
어떤 도움이라도 주시면 감사하겠습니다!
문제는 당신이 그들을 자유롭게 한다는 것입니다.sym
, 그런 다음 (지금은 사용할 수 없는) 데이터에서 값에 액세스하려고 시도합니다.sym->next
.
내부 루프에 대해 다음과 같은 것을 원할 것입니다.
struct symbol *next_sym = NULL;
for(sym = st[i]; sym != NULL; ) {
next_sym = sym->next;
free(sym);
sym = next_sym;
}
배열이 구조체 또는 구조체에 대한 포인터를 포함하도록 의도되었는지 여부도 명확하지 않습니다.
struct symbol *st[PARSER_HASH_SIZE];
구조물에 대한 포인터들의 배열이라고 합니다.하지만 당신은 말합니다.
"내 프로그램이 초기화되면, 이 배열의 모든 요소는 0으로 초기화됩니다."
memset(&st[0], 0, sizeof(st));
이것은 그 항목들을 구조물처럼 취급하는 것입니다.
배열을 없애다
for (int i = 0; i < PARSER_HASH_SIZE; i++)
{
st[i] = 0;
}
언급URL : https://stackoverflow.com/questions/4035769/invalid-read-of-size-8-valgrind-c
반응형
'programing' 카테고리의 다른 글
uitabbar controller 숨김 방법 (0) | 2023.10.23 |
---|---|
사이트가 주기적으로 중단되고 "Myql connect error [localhost]: (2002) Connection rejected (400)" 오류가 발생합니다. (0) | 2023.10.23 |
zLib을 사용하여 감압 및 팽창 (0) | 2023.10.23 |
mysql2 버전(0.3.2)은 이제 Rails 3.1의 일부이므로 ActiveRecord 어댑터가 번들로 제공되지 않습니다. (0) | 2023.10.23 |
SQL 0(음의 값인 경우) (0) | 2023.10.18 |