почему больше malloc вызывает исключение? [Дубликат]

Примером этого исключаемого исключения является: Когда вы пытаетесь проверить что-то, это null.

Например:

string testString = null; //Because it doesn't have a value (i.e. it's null; "Length" cannot do what it needs to do)

if (testString.Length == 0) // Throws a nullreferenceexception
{
    //Do something
} 

Время выполнения .NET исключение NullReferenceException при попытке выполнить действие над чем-то, что не было инстанцировано, т.е. код выше.

По сравнению с ArgumentNullException, которое обычно выбрано как защитная мера, если метод ожидает, что то, что происходит

Дополнительная информация находится в C # NullReferenceException и Null Parameter .

3
задан Joshua Enfield 8 December 2010 в 01:35
поделиться

4 ответа

1- Если вы работаете на 32-битной машине, у вас не может быть переменной с более чем 2 ГБ, выделенной для нее.

2- Если вы работаете на 64-битной машине, вы может выделять столько, сколько RAM + Swap-память в целом, однако для выделения всего для одной переменной требуется большой последовательный фрагмент памяти, который может быть недоступен. Попробуйте со связанным списком, где каждый элемент имеет только 1 МБ, и вы можете достичь высшей памяти, выделенной в общей сложности.

3- Как уже отмечалось вами и Шартом, если вы не используете свою память, Linux выиграл 't выделить его.

3
ответ дан Pirooz 26 August 2018 в 11:29
поделиться

Некоторые примечания:

  1. Как замечают комментарии, Linux фактически не выделяет вашу память, пока вы ее не используете.
  2. Когда вы используете calloc вместо malloc, обнуляет всю запрошенную память. Это эквивалентно его использованию.
7
ответ дан Bill Lynch 26 August 2018 в 11:29
поделиться

Ваш цикл for в вашем примере кода на самом деле касается 1 ГБ памяти, так как он индексирует 128 * 1024 * 1024 long long s, а каждый long long равен 8 байтам.

1
ответ дан caf 26 August 2018 в 11:29
поделиться

Ваш # 2 терпит неудачу с segfault либо потому, что sizeof(long long int) > 8, либо потому, что ваш malloc возвратил NULL. Это очень возможно, если вы запрашиваете 1 ГБ ОЗУ.

Подробнее о № 2. Из вашего комментария 128 МБ я понимаю, что вы не можете понять, что происходит. Поскольку вы объявляете указатель массива как long long int, размер каждого элемента массива равен 8 байтам. 1024/8 == 128, поэтому ваш цикл работает. Так или иначе, когда я это пробовал.

1
ответ дан Zan Lynx 26 August 2018 в 11:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: