Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / strtok или new / 3 сообщений из 3, страница 1 из 1
28.11.2005, 10:08
    #33402592
День
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
strtok или new
привет всем.

ось - линукс

есть код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
int main(int arc, char **argv)
{
	MainFunc();
	return  0 ;
}

void MainFunc()
{
	int pid;
	if ((pid = fork()) == - 1 )
	{
		printf("err: Fork");
		return;
	}
	if (pid ==  0 )
		...
		split(....);
		...
	else
	{
		wait и проверка кода завершения
	}
}



int split (char* massive[], int massive_size, char* str, char* delim)
{
	int j =  0 ;
	char *workstr = new char [strlen (str) +  1 ];
	char *temp;
	bzero (workstr, strlen (str) +  1 );
	strcpy (workstr, str);
	temp = workstr;
	char *token = strtok (temp, delim);

	while ((token != NULL) && (j < massive_size))
	{
		massive [j] = new char [strlen (token)+ 1 ];
		if (long (massive[j]) ==  0 )
		{
			printf("err: Memory %d\n",strlen(token)+ 1 );
			delete workstr;
			return - 1 ;
		}
		bzero (massive [j], strlen(token)+ 1 );
		strcpy (massive [j], token);
		printf("!%s!\n", massive [j]);
		j++;
		
		token = strtok (NULL, delim);
	}
	delete workstr;

	return j;
}

дочерний процесс один. стабильно завершается по сигналу 11 - ошибка доступа к памяти.
причем часто вылетает так, что printf("!%s!\n", massive [j]); отрабатывает наполовину, т.е. первый ! есть а завершаеющего нет.

в чем моя ошибка?
буду рад любому мнению по поводу кода.
...
Рейтинг: 0 / 0
28.11.2005, 20:06
    #33404469
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
strtok или new
Во первых, не советую использовать new. New это команда из C++, в С надо использовать malloc(). Не особо критично, но нехорошо :)
Во вторых, не нужно обнулять буфер перед копированием. Убери строку с bzero() совсем.
Выделение памяти и проверка:
Код: plaintext
1.
massive [j] = new char [strlen (token)+ 1 ];
if (long (massive[j]) ==  0 )
выглядит странновато. Обычно на С пишут:
Код: plaintext
1.
massive[j] = malloc(strlen(token)+ 1 );
if( ! massive[j] ) { ... memory error

Ну и в конце, концов: А ты уверен что massive_size совпадает с реальным размером массива? :) Если massive объявлен константного размера, то проверку
Код: plaintext
while ((token != NULL) && (j < massive_size))
лучше бы переписать в:
Код: plaintext
while ((token != NULL) && (j < sizeof(massive)/sizeof(massive[ 0 ])))
.
Иначе можно играться с перераспределением памяти под него через функцию realloc();
...
Рейтинг: 0 / 0
29.11.2005, 10:00
    #33404950
День
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
strtok или new
Огромной спасибо!
Сегодня попробуй использовать ваши замечания.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / strtok или new / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]