memset () ведет себя нежелательно - PullRequest
0 голосов
/ 14 декабря 2011

Я использую функцию memset в C и у меня проблема. Вот моя проблема:

char* tail;
tail = //some memory address
int pbytes = 5;

Когда я вызываю memset, как:

**memset(tail+pbytes, 0 , 8); // It gives no error**

Когда я вызываю memset, как:

**memset(tail+pbytes, 0 , 9); // It goes into infinite loop**

Когда я вызываю memset, как:

**memset(tail+pbytes, 0 , 10); // last parameter (10 or above). It gives Segmentation fault**

Что может быть причиной этого? Программа запускается и выдает выходные данные по желанию, но в конце выдает ошибку сегментации. Я использую виртуальную машину Linux 64.

Любая помощь будет оценена.

OK. Позвольте мне уточнить больше с тем, что я делаю. Я делаю 128 байтов (0-127 в массиве) данных. Я записываю 0 (NULL) из байта 112 в 119 (все идет хорошо), но когда я пытаюсь записать 0 в 120-й байт и запускаю программу, она идет в бесконечный цикл. Если я пишу 1,2,4,6 на 120-м байте, программа работает хорошо. Если я записываю другие числа в 120-й байт, программа выдает ошибку сегментации. В основном, что-то не так с байтами от 120 до 127.

1 Ответ

0 голосов
/ 05 декабря 2012

В этом нет ничего плохого memset. Что-то не так с тем, как вы определили переменную-указатель tail.

Если вы просто написали

    char tail[128];
    memset(tail+5, 0, 9);

конечно, это будет нормально работать. Ваша проблема в том, что вы не делаете ничего такого простого и правильного; вы делаете что-то неясное и неправильное, например

    char tail[1];
    memset(tail+5, 0, 9);

или

void foo(int x) {
    char *tail = &x;
    memset(tail+5, 0, 9);
}

Перефразируя Чарльза Бэббиджа: Когда вы вводите неверный код в машину, появляются неправильные ответы.

Сегфоут, вероятно, потому, что вы пытаетесь записать виртуальный адрес, который еще не был выделен. Бесконечный цикл может быть вызван тем, что вы перезаписываете некоторую часть адреса возврата memset, чтобы он вернулся в неправильное место (например, в середину бесконечного цикла) вместо того, чтобы возвращаться в то место, откуда он был вызван.

...