Мне было скучно, и я хотел создать программу, которая могла бы сломать мой компьютер: P. Мне бы это бесполезно и избыточно выделять память до момента сбоя. Код, который я создал до сих пор, находится здесь:
#include <cstdlib>
#include <cstdio>
int main(int argc, const char *argv)
{
int n = 0;
while (1)
{
n++;
int* buffer = (int*)malloc(n ^ n);
int* buffer_buffer = (int*)calloc(n, sizeof(buffer));
for (int i = 0; i < n; i++) {
printf("%p", &buffer);
printf("\n");
buffer_buffer[i] = (int)buffer;
}
}
}
Код работает (он дает сбой компьютеру), но работает не так, как ожидалось. Я хотел больше узнать о том, как он работает и что именно он делал, поэтому я установил несколько точек останова и решил пройти через это. Я ожидал увидеть buffer_buffer
перераспределяется снова и снова, содержащий n
числа buffer
, но это не так. Вместо этого мой отладчик показывает, что buffer_buffer
содержит одно значение, которое иногда будет меняться, и одно значение (целое приведение buffer
по крайней мере, я надеюсь) записывается каждый цикл. Я ожидал buffer_buffer
расти с n
число элементов каждый раз, когда вокруг цикл for приходит, но у него есть только один элемент. Чтобы визуализировать это, вот скриншот отладчика:
Снова я немного устал, и это, вероятно, проблема с моей логикой цикла. Кто-нибудь знает, почему моя программа испытывает такое неожиданное поведение? Я использую отладчик Microsoft Visual Studio
Возможно, ваш отладчик не знает, насколько большой buffer_buffer
, так как эта переменная просто объявлена как указатель на int
, (Это неправильно напечатано; buffer_buffer
используется для хранения значений buffer
который является int*
, так buffer_buffer
должен быть массивом int*
Это означает, что вы должны объявить это как int**
то есть указатель на последовательность int*
.) Одна из небольших проблем при отладке программ на C состоит в том, что длина массива вообще нигде не сохраняется; Вы должны следить за этим самостоятельно. Так что отладчик тоже не знает.
Также, n^n
0, так как ^
является оператором XOR. Я не знаю, если это то, что вы хотели.
(На самом деле, это не совсем верно, что размер выделения нигде не хранится. Это может быть, или какое-то приближение к нему может быть. Но он хранится во внутренней части библиотеки выделения памяти, и нет никакого способа добраться до него И в любом случае, это может быть не правильно, потому что библиотека иногда выделяет больше, чем вы просили, и запоминает только то, что распределяла, а не то, что вы просили.)