созданный calloc массив не работает как ожидалось

Мне было скучно, и я хотел создать программу, которая могла бы сломать мой компьютер: 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

1

Решение

Возможно, ваш отладчик не знает, насколько большой buffer_buffer , так как эта переменная просто объявлена ​​как указатель на int, (Это неправильно напечатано; buffer_buffer используется для хранения значений buffer который является int*, так buffer_buffer должен быть массивом int*Это означает, что вы должны объявить это как int**то есть указатель на последовательность int*.) Одна из небольших проблем при отладке программ на C состоит в том, что длина массива вообще нигде не сохраняется; Вы должны следить за этим самостоятельно. Так что отладчик тоже не знает.

Также, n^n 0, так как ^ является оператором XOR. Я не знаю, если это то, что вы хотели.


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

4

Другие решения


По вопросам рекламы [email protected]