powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / strtok или new
3 сообщений из 3, страница 1 из 1
strtok или new
    #33402592
День
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
привет всем.

ось - линукс

есть код:
Код: 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
strtok или new
    #33404469
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во первых, не советую использовать 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
strtok или new
    #33404950
День
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромной спасибо!
Сегодня попробуй использовать ваши замечания.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / strtok или new
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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