Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2013, 12:57   #31
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
ПС Дописывайте свое последнее сообщение, а не пишите несколько подряд (можно заработать штраф).
штраф? что такое штраф?

Дописываю сюда
Код:
struct Node* traversal(byte data, struct Node* node){
	struct Node *node_1,* node_2;
		node_1 = *node -> next;
			
			while(*node -> next && (*node -> next) -> n != data && *node -> next++);
		
		node_2 = *node -> next;
		*node -> next = node_1;
	
	return node_2;
}
проверял, адреса становятся как были и при етом возвращается адрес найденной структуры, но всёравно выхожу за пределы массива.
Со вставленным циклом прокатывает..значит опять при освобождении памяти гдето кудато нетуда лезу.
Цитата:
Чуть переделанный Ваш вариант
И с этим вариантом память освобождается херовенько.
do not use your brain

Последний раз редактировалось Кащей; 23.08.2013 в 17:55.
Кащей вне форума Ответить с цитированием
Старый 23.08.2013, 13:07   #32
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от Кащей Посмотреть сообщение
Итак...как обойти изменение указателя не используя цикл?
Посмотрите 29 сообщение темы (я его дописывал, не обновляя страницу).
Цитата:
Сообщение от Кащей Посмотреть сообщение
штраф? что такое штраф?
Штрафные баллы - http://programmersforum.ru/rules.php.
Цитата:
В зависимости от количества баллов определяется продолжительность блокировки доступа на форум. При серьёзных нарушениях блокировка не будет снята никогда.
UPD
"Прогнал" Вашу реализацию функции через Dr. Memory:
Цитата:
ERRORS FOUND:
0 unique, 0 total unaddressable access(es)
0 unique, 0 total uninitialized access(es)
1 unique, 1 total invalid heap argument(s)
0 unique, 0 total GDI usage error(s)
0 unique, 0 total warning(s)
0 unique, 0 total, 0 byte(s) of leak(s)
1 unique, 1 total, 16 byte(s) of possible leak(s)
Чуть переделанный Ваш вариант:
Код:
struct Node*
traversal(byte data, struct Node* node){
    struct Node **node_1, *node_2;
    node_1 = node->next;
    while(*node->next && (*node->next)->n != data && node->next++);
    node_2 = *node->next;
    node->next = node_1;
    return node_2;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 23.08.2013 в 16:05.
BDA на форуме Ответить с цитированием
Старый 23.08.2013, 18:56   #33
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от Кащей Посмотреть сообщение
И с этим вариантом память освобождается херовенько.
Как Вы проверяете? Выложите тогда уж весь код и список ошибок/сообщений. Кстати, в какой среде пишете?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 24.08.2013, 00:13   #34
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

то что я выкладывал это и есть весь код. Пишу в Geany.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define COUNT 4

typedef unsigned char byte;

struct Node{
	byte 			n;
	struct Node**	next;
};

struct Node* traversal(byte data, struct Node* node){
	struct Node* next_1,* next_2;
		next_1 = *node -> next;
			while(*node -> next && (*node -> next) -> n != data && *node -> next++);
		next_2 = *node -> next;
		*node -> next = next_1;
		printf("next_1 %p\n", next_1);
	return next_2;
}
//----------------------------------------------------------------------
void free_all(struct Node* node){
	if(*node -> next){
		printf("*node -> next %p\n", *node -> next); free(*node -> next);}
	while(*node -> next && *node -> next++){
		printf("*node -> next %p\n", *node -> next);
		free(*node -> next);
	}
}

int create_all(struct Node* node){
	int i, j;

	for (i = 0; i < COUNT; ++i){
		node[i].n = (i + 1) * 10;
		node[i].next = malloc(sizeof(struct Node*) * COUNT);
		node[i].next[COUNT - 1] = NULL;
		for (j = 0; j < COUNT - 1; ++j)
			node[i].next[j] = &node[(i + j + 1) % COUNT];
	}
			
	return 0;
}
//----------------------------------------------------------------------
int main(void){
	struct Node node[COUNT];
	struct Node* t_node = NULL;
	
	if(create_all(node) == 0)
		t_node = traversal(30, &node[1]);
		
	if(t_node != NULL) printf("%d\n", t_node -> n);
	else puts("\n\n---------->| NULL |<----------\n\n");
		printf("*node -> next %p\n", *node -> next);
		
	free_all(node);
	
	return 0;
}
Код:
*** glibc detected *** ./Noder: double free or corruption (out): 0x00007fff358a37b0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7f06a3327b96]
./MB[0x4006c5]
./MB[0x4008af]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f06a32ca76d]
./MB[0x400519]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:06 3670292                            /home/Dropbox/Noder
00600000-00601000 r--p 00000000 08:06 3670292                             /home/Dropbox/Noder
00601000-00602000 rw-p 00001000 08:06 3670292                             /home/Dropbox/Noder
025e3000-02604000 rw-p 00000000 00:00 0                                  [heap]
7f06a3093000-7f06a30a8000 r-xp 00000000 08:06 134824                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f06a30a8000-7f06a32a7000 ---p 00015000 08:06 134824                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f06a32a7000-7f06a32a8000 r--p 00014000 08:06 134824                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f06a32a8000-7f06a32a9000 rw-p 00015000 08:06 134824                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f06a32a9000-7f06a345e000 r-xp 00000000 08:06 131193                     /lib/x86_64-linux-gnu/libc-2.15.so
7f06a345e000-7f06a365d000 ---p 001b5000 08:06 131193                     /lib/x86_64-linux-gnu/libc-2.15.so
7f06a365d000-7f06a3661000 r--p 001b4000 08:06 131193                     /lib/x86_64-linux-gnu/libc-2.15.so
7f06a3661000-7f06a3663000 rw-p 001b8000 08:06 131193                     /lib/x86_64-linux-gnu/libc-2.15.so
7f06a3663000-7f06a3668000 rw-p 00000000 00:00 0 
7f06a3668000-7f06a368a000 r-xp 00000000 08:06 131207                     /lib/x86_64-linux-gnu/ld-2.15.so
7f06a386e000-7f06a3871000 rw-p 00000000 00:00 0 
7f06a3886000-7f06a388a000 rw-p 00000000 00:00 0 
7f06a388a000-7f06a388b000 r--p 00022000 08:06 131207                     /lib/x86_64-linux-gnu/ld-2.15.so
7f06a388b000-7f06a388d000 rw-p 00023000 08:06 131207                     /lib/x86_64-linux-gnu/ld-2.15.so
7fff35885000-7fff358a6000 rw-p 00000000 00:00 0                          [stack]
7fff35977000-7fff35978000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted (core dumped)
do not use your brain

Последний раз редактировалось Кащей; 24.08.2013 в 00:19.
Кащей вне форума Ответить с цитированием
Старый 24.08.2013, 00:55   #35
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Кхм, но этот код отличается от предыдущих выложенных.
Запустил Ваш код в Dr. Memory:
Цитата:
Dr. Memory version 1.5.1 build 6 built on Feb 25 2013 00:45:31

Error #1: INVALID HEAP ARGUMENT to free() 0x0028ff04
# 0 free_all

Error #2: INVALID HEAP ARGUMENT to free() 0x0028ff0c
# 0 free_all

Error #3: LEAK 16 direct bytes 0x00560e88-0x00560e98 + 0 indirect bytes
# 0 create_all

DUPLICATE ERROR COUNTS:
Error # 2: 2
Error # 3: 4

SUPPRESSIONS USED:

ERRORS FOUND:
0 unique, 0 total unaddressable access(es)
0 unique, 0 total uninitialized access(es)
2 unique, 3 total invalid heap argument(s)
0 unique, 0 total GDI usage error(s)
0 unique, 0 total warning(s)
1 unique, 4 total, 64 byte(s) of leak(s)
0 unique, 0 total, 0 byte(s) of possible leak(s)
ERRORS IGNORED:
61 still-reachable allocation(s)
Ту же самую картину наблюдаю, заменив traversal на свой. Из вышесказанного следует вывод, что ошибка не в traversal, а в другой части кода. Вы не можете так освобождать память по нескольким причинам:
1) Нет специального элемента в node[COUNT] (последнего), который содержал бы в поле next NULL (цикл может вылезти за границы массива)
2) Вы вызываете free не для тех указателей, по которым выделяли память (в данной реализации)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 24.08.2013, 02:27   #36
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Слава мне!Хвала мне и почот!
Я его поборол.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define COUNT 4

typedef unsigned char byte;

struct Node{
	byte n;
	struct Node** next;
};

struct Node* traversal(byte data, struct Node* node){
	struct Node node_2 = *node;
		while(*node_2.next && (*node_2.next) -> n != data && node_2.next++);
	return *node_2.next;
}
//----------------------------------------------------------------------
void free_all(struct Node* node){
	int i;
		if(node)
			for(i = 0; i < COUNT; i++)
				if(node[i].next)
					free(node[i].next);
}

int create_all(struct Node* node){
	int i, j;

	for (i = 0; i < COUNT; ++i){
		node[i].n = (i + 1) * 10;
		node[i].next = malloc(sizeof(struct Node*) * COUNT);
		node[i].next[COUNT - 1] = NULL;
		for (j = 0; j < COUNT - 1; ++j)
			node[i].next[j] = &node[(i + j + 1) % COUNT];
	}
			
	return 0;
}
//----------------------------------------------------------------------
int main(void){
	struct Node node[COUNT];
	struct Node* t_node = NULL;
	
	if(create_all(node) == 0)
		t_node = traversal(30, &node[0]);
		
	if(t_node != NULL) printf("%d\n", t_node -> n);
	else puts("\nNULL\n");
		
	free_all(node);
	
	return 0;
}
Скоро будет второй уровень квеста - массив указателей на структуры содержащие в себе массивы указателей на структуры. :D
do not use your brain

Последний раз редактировалось Кащей; 24.08.2013 в 02:34.
Кащей вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с указателями compiler90 Visual C++ 1 04.06.2012 18:52
Работа с указателями yaapelsinko Общие вопросы Delphi 3 15.02.2012 01:13
Работа с указателями Byurrer Общие вопросы C/C++ 8 02.04.2011 21:09
Работа с указателями stas135642 Общие вопросы C/C++ 2 21.11.2010 15:05
Работа с указателями Mango Помощь студентам 2 23.11.2008 10:33