Я бы не сказал, что какой-либо один способ выделения структуры имеет «больше шансов на коррупцию».Все, что вызывает коррупцию, может произойти так же легко, как бы она ни выделялась.
Я бы сказал, что вам лучше исправить источник повреждения: вы можете использовать gdb для установки точки останова при записи в поврежденную переменную с помощью watch <varname>
.Кроме того, вы можете также поставить точку останова при обнаружении повреждения, а затем использовать обратная отладка , чтобы найти, где произошло повреждение.
Редактировать: Кажется, есть некоторая путаница относительно значения стека и static
распределение:
void foo() {
int a[10]; // stack
static int b[10]; // static
int *c = malloc(sizeof(int) * 10); // dynamic on the heap
}
Стек Переменные действительны только в течение времени жизни функции - после того, как эта функция вернулась, вы не можете ожидать, что данные в местоположении a
будут по-прежнему действительными.Иногда их называют локальные или автоматические переменные.
Статические переменные внутри функции действительны и вне функции - данные хранятся вокругмежду вызовами функций.Это означает, что если вы сделаете это:
void foo() {
static int a = 0;
a++;
printf("%d\n",a);
}
Напечатанное число будет увеличиваться на единицу при каждом вызове foo()
.Как правило, функции не имеют много переменных, объявленных как статические, потому что статические переменные запоминают свое последнее значение с момента последнего вызова функции, что обычно не соответствует желаемому поведению.Возможно, именно это и имел в виду человек, который сказал вам, что статические переменные имеют «больше шансов быть поврежденными».
Куча переменные действительны с момента их создания и до'1034 * d.Это также называется динамическое выделение и это то, что вам нужно, если вы планируете возвращать данные в другую часть программы (или если вы хотите указать длину массива во время выполнения в C89).
В сторону: static
сбивает с толку, поскольку при применении к имени функции или переменной в глобальной области видимости:
static void foo() { ... }
static int x;
это означает, что «эта функция или переменная видна только внутриэтот переводческий блок ".Я не уверен, почему ключевое слово static
имеет два разных значения.