Почему strcpy инициировал отказ сегментации с глобальными переменными?

Проверьте следующие шаги

  1. Database.SetInitializer (null); -> in Global.asax.cs

2.

  1. ваше имя класса контекста должно совпадать с его проверкой
7
задан codemonkey 10 November 2011 в 17:32
поделиться

8 ответов

Как другие упомянутые плакаты, корень проблемы - то, что временный файл является неинициализированным. При объявлении как автоматическая переменная на стеке он будет содержать любой мусор, оказывается, находится в той ячейке памяти. По-видимому, для compiler+CPU+OS Вы работаете, мусор в том местоположении является допустимым указателем. strcpy "успешно выполняется", в котором он не делает segfault, но действительно он скопировал строку в некоторое произвольное местоположение в другом месте в памяти. Этот вид проблемы повреждения памяти ударяет страх в основы программистов C везде, поскольку чрезвычайно трудно отладить.

При перемещении временного объявления переменной в глобальную область видимости оно помещается в раздел BSS и автоматически обнуляется. Попытки разыменовать *временный файл затем приводят к segfault.

Когда Вы перемещаетесь *путь к глобальной области видимости, затем *, временный файл перемещает одно местоположение вверх на стеке. Мусор в том местоположении является, по-видимому, не допустимым указателем, и таким образом разыменовывая *временные результаты в segfault.

16
ответ дан 6 December 2019 в 04:59
поделиться

Временная переменная не указывает ни на какое устройство хранения данных (память), и это является неинициализированным.

если временный файл объявляется как char temp[32]; затем код работал бы, неважно, где он объявляется. Однако существуют другие проблемы с объявлением временного файла с фиксированным размером как этот, но это - вопрос в течение другого дня.

Теперь, почему это отказывает при глобальном объявлении и не локально. Удача...

При локальном объявлении значение временного файла прибывает из того, что когда-либо оценивает, мог бы быть на стеке в то время. Это - удача, на которую это указывает на адрес, который не вызывает катастрофический отказ. Однако это повреждает память, используемую кем-то еще.

При глобальном объявлении на большинстве процессоров эти переменные будут сохранены в сегментах данных, которые будут использовать нулевые страницы спроса. Таким образом char *temp появляется, как будто это было объявлено char *temp=0.

9
ответ дан 6 December 2019 в 04:59
поделиться

Вы забыли выделять и инициализировать временный файл:

temp = (char *)malloc(TEMP_SIZE);

Просто удостоверьтесь, что TEMP_SIZE является достаточно большим. Можно также вычислить это во времени выполнения, затем удостоверьтесь, что размер достаточно (должен быть, по крайней мере, strlen (путь)),

8
ответ дан 6 December 2019 в 04:59
поделиться

Нет - это не работает независимо от переменных - просто похоже, что это сделало, потому что Вы добрались удачная (ООН). Необходимо выделить место, чтобы сохранить содержание строки, вместо того, чтобы оставить переменную неинициализированной.

Неинициализированные переменные на стеке будут указанием на в значительной степени случайные местоположения памяти. Если эти адреса, окажется, будут допустимы, то Ваш код растопчет на всем протяжении того, что было там, но Вы не получите ошибку (но может получить противные связанные с повреждением памяти ошибки в другом месте в Вашем коде).

Globals последовательно перестали работать, потому что они обычно устанавливаются на определенные шаблоны, которые указывают на неотображенную память. Попытка разыменовать их сразу дает Вам segfault (который лучше - оставление это позже делает ошибку очень трудно для разыскивания).

2
ответ дан 6 December 2019 в 04:59
поделиться

Как упомянуто выше, Вы забыли выделять место для временного файла. Я предпочитаю strdup кому: malloc+strcpy. Это делает то, что Вы хотите сделать.

3
ответ дан 6 December 2019 в 04:59
поделиться

Я хотел бы переписать фрагмент первого Adam как

// Make temp a static array of 256 chars
char temp[256];
strncpy(temp, sizeof(temp), path);
temp[sizeof(temp)-1] = '\0';

Тем путем Вы:

1. don't have magic numbers laced through the code, and
2. you guarantee that your string is null terminated.

Вторая точка в потере последнего символа Вашей исходной строки, если это> =256 символов в длину.

2
ответ дан 6 December 2019 в 04:59
поделиться

Важная часть для замечания:
целевая строка dest должна быть достаточно большой для получения копии.
В Вашей ситуации временный файл не имеет никакой памяти, выделенной для копирования в.

Скопированный со страницы справочника strcpy:

DESCRIPTION
   The  strcpy()  function  copies the string pointed to by src (including
   the terminating '\0' character) to the array pointed to by  dest.   The
   strings  may not overlap, and the destination string dest must be large
   enough to receive the copy.
1
ответ дан 6 December 2019 в 04:59
поделиться

Вы вызываете неопределенное поведение, так как Вы не инициализируете temp переменная. Это указывает на случайное местоположение в памяти, таким образом, Ваша программа может работать, но скорее всего это будет segfault. У Вас должна быть своя целевая строка быть массивом, или иметь его указывают на динамическую память:

// Make temp a static array of 256 chars
char temp[256];
strncpy(temp, 256, path);

// Or, use dynamic memory
char *temp = (char *)malloc(256);
strncpy(temp, 256, path);

Кроме того, используйте strncpy() вместо strcpy() избегать переполнения буфера.

1
ответ дан 6 December 2019 в 04:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: