Я работаю с некоторым древним унаследованным кодом, который выполнялся в Solaris 10. На старом сервере код скомпилировался и без проблем работал.
Затем этот код был перенесен на сервер Solaris 11, где код все еще компилируется, но при запуске создает дамп ядра ошибки сегмента.
В обоих случаях использовался компилятор /opt/SUNWspro/bin/cc.
Вот фрагмент кода:
#include <stdio.h>
char *blank = " ";
main(argc,argv)
int argc;
char **argv;
{
blank[35] = '\0';
printf("Success.\n");
}
Это сработало в Solaris 10, но вызывает ошибку сегментации (сбрасывается ядро) в Solaris 11. Обычно я бы сказал, что причиной segfault является попытка записи в пустое [ 35], когда пустой массив [] становится пустым [34] (он инициализируется 35 пробелами), за исключением того, что этот код работал на Solaris 10.
Кроме того, когда я изменяю строку на ' пусто [34] = '\ 0'; ' на новом сервере я по-прежнему получаю дамп ядра segfault.
Когда я заменяю пустой на обычный массив (а также модернизирую основной), все работает нормально, как я и ожидал:
#include <stdio.h>
char blank[35];
int main(int argc,char **argv)
{
int i;
for (i=0; i<34; i++)
{
blank[i] = ' ';
}
blank[34] = '\0';
printf("Success.\n");
return 0;
}
Что мне действительно нужно знать, так это почему этот код хорошо работает на старом сервере, и что я пропускаю? Я могу изменить код для использования обычного массива, чтобы он работал на новом сервере, но какие проблемы это может вызвать?