Я написал приведенную ниже функцию c, чтобы получить строку от пользователя. Он использует realloc для динамического изменения размера массива символов, чтобы приспособиться к неизвестной длине массива символов. Насколько я понимаю, он должен иметь возможность принимать столько входных данных, сколько вы можете ему передать (или иметь доступную память), однако, когда я пытаюсь передать ему текст из рандомизированного текстового файла (используется "tr '\n' ' ' ./random.txt", чтобы убедиться, что я удалил все новые строки из текстового файла), я получаю сообщение "Невозможно выделить память для хранения массива символов. Выход!" сообщение об ошибке. Почему это происходит? Должен ли мой массив вмещать до гигабайт данных, поскольку у меня 16 гигабайт ОЗУ, так как он был разработан для динамического роста?
#include <stdio.h>
#include <stdlib.h>
void GetString(int*, int*);
int main(void)
{
unsigned int strLength = 32;
char *stringPtr = malloc(strLength);
if (stringPtr == NULL)
{
fprintf(stderr, "Unable to allocate memory to hold char array. Exiting!\n");
return 1;
}
printf("Enter some input: ");
int c = EOF;
unsigned int i = 0;
while ((c = getchar()) != '\n' && c != EOF)
{
stringPtr[i++] = (char) c;
if (i == strLength)
{
strLength *= strLength;
if ((stringPtr = realloc(stringPtr, strLength)) == NULL)
{
fprintf(stderr, "Unable to expand memory to hold char array. Exiting!\n");
return 2;
}
}
}
stringPtr[i] = '\0';
if (sizeof(stringPtr) < strLength)
{
stringPtr = realloc(stringPtr, i);
}
printf("\n\nString value: %s\n\n\n", stringPtr);
free(stringPtr);
stringPtr = NULL;
}
unsigned int strLength
наsize_t strLength
. Кроме того, убедитесь, что вы компилируете в 64-битном режиме, если вы хотите использовать более 2-3 ГБ памяти в одном процессе. - person zwol   schedule 14.10.2014strLength *= strLength;
растет быстро, может бытьstrLength *= 2;
? - person chux - Reinstate Monica   schedule 14.10.2014