LINUX.ORG.RU

Скажите, где ошибка?


0

0

Не работает этот блок - SefFault в strcmp:

	while (getline(&line, &len, descr) != -1) {
		n = sscanf(line, "%s %d", &filename, &count);
		if (n < 2)
			continue;
		for (i = 0; i < count; i++) {
			if (! strcmp(filename, "default"))
				agent = agent_new_default();
			else
				agent = agent_new_from_object(filename);
			x = (int)((double)rand())/((double)RAND_MAX)*earth_width;
			y = (int)((double)rand())/((double)RAND_MAX)*earth_height;
			list_add(&world->agents, agent);
			list_add(&world->earth[x][y].agents, agent);
			agent->cell = &world->earth[x][y];
		}
		
	}

С помощью gdb обнаружил, что sscanf возвращает неверный указатель - на невыделенную область. Я что-то делаю не так?

(gdb) b 68
Breakpoint 1 at 0x8048a0a: file agtevo1.c, line 68.
(gdb) r
Starting program: /home/wieker/Projects/agtevo/agtevo 

Breakpoint 1, populate_world (world=0x804c008) at agtevo1.c:68
68			n = sscanf(line, "%s %d", &filename, &count);
(gdb) s
69			if (n < 2)
(gdb) print filename
$1 = 0x61666564 <Address 0x61666564 out of bounds>
(gdb) print count
$2 = 100
(gdb) print line
$3 = 0x80515f0 "default 100\n"
(gdb) 
★★

А кто тебе сказал, что sscanf должен выделять память? Ему нужен указатель на уже выделенный буфер.

kemm
()

Прочитал еще раз man. Меня сбил пример

  char *p;
           int n;

           errno = 0;
           n = scanf("%a[a-z]", &p);
           if (n == 1) {
               printf("read: %s\n", p);
               free(p);
           } else if (errno != 0) {
               perror("scanf");
           } else {
               fprintf(stderr, "No matching characters\n"):
           }

В самом текст сказано, что память надо выделить. Тогда вопрос ставлю по другому - пример из мана рабочий?

wieker ★★
() автор топика
Ответ на: комментарий от kemm

Понял уже, спасибо. В мане так и сказано, что память надо выделаять. Просто примерчик там есть, без выделения, меня он сбил.

wieker ★★
() автор топика
Ответ на: комментарий от wieker

> Просто примерчик там есть, без выделения, меня он сбил.

scanf может и сам выделять, но это уже GNU-специфичное расширение.

Deleted
()
Ответ на: комментарий от kemm

Как-то он непонятно себя ведет. 1) Ему передается указатель на указатель, такое обычно бывает, когда функция сама выделяет память. 2) sscanf меняет указатель, на неразмеченную область памяти. Не понимаю, что такое.

(gdb) s
68			n = sscanf(line, "%s %d", &filename, &count);
(gdb) print filename
$2 = 0x8051488 ""
(gdb) s
69			if (n < 2)
(gdb) print filename
$3 = 0x61666564 <Address 0x61666564 out of bounds>
(gdb) 
wieker ★★
() автор топика
Ответ на: комментарий от wieker

Примерчик хороший. Только читать надо внимательнее. Там стоит модификатор 'a' (это гнутое расширение).

kemm
()
Ответ на: комментарий от wieker

%a<...> это гнутое расширение scanf для выделения памятив нутри scanf

chicane
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.