что может быть не так:char* param= новый char[200];

StackOverflow https://stackoverflow.com/questions/858338

  •  21-08-2019
  •  | 
  •  

Вопрос

Я пишу программу на C++ и по какой-то причине получаю ошибку сегментации в следующей строке:

char* param= new char[200];

Я пробовал разные варианты и даже пробовал ставить перед этим

int* param= new int;//for no reason

и возникает та же ошибка.Что я мог сделать, чтобы вызвать эту проблему?

Что может привести к тому, что такое простое распределение памяти может вызвать проблемы?

Я бы включил остальную часть программы, но там больше 1000 строк.Но не стесняйтесь спрашивать дополнительную информацию.

Это было полезно?

Решение

Я бы сказал, что Нил на правильном пути - возможно, это что-то, на что вы наткнулись ранее, и это только там и ловится.

Вы убедились, что:

  1. Все предыдущие распределения прошли успешно.
  2. Вы не написали дальше конца или начала каких-либо массивов (есть множество информации и инструментов для проверки границ там).

[Редактировать] В ответ на ваш комментарий о наличии 4 ГБ ОЗУ предположим, что ваш код эффективно выполняет следующее:

unsigned int amountToAllocate = 0;
amountToAllocate -= 1;

int* someStorage = new int[amountToAllocate];

someStorage[0] = 5;

...потому что amountToAllocate является unsigned int, он будет округлен до максимального значения (4294967295, если unsigned intна вашем оборудовании они 32-битные).Таким образом, вы попытаетесь выделить 4294967295*4 байта (опять же, предполагая, что intу вас 32 бита)...который составляет ~ 4 * 4 ГБ, выйдет из строя и умрет ужасной смертью.

Другие советы

Выполняете ли вы какое-либо выделение и освобождение памяти до этого момента?Если да, то вы, вероятно, каким-то образом повредили кучу.Невозможно провести дальнейшую диагностику, не видя больше кода.

Вот как вы можете его использовать: например, я заменил char на int для хранения некоторых значений, но с char работает то же самое.

#include <iostream>

using namespace std;

int main()
{
    int * param = new int[200];

    for (int i = 0; i < 200; ++i) param[i] = i;
    for (int i = 0; i < 200; ++i) cout << param[i] << endl;

    delete[] param;

    return 0;
}

Сначала убедитесь, что эта строка является проблемой.Что произойдет, если вы закомментируете это?(или замените его на char *param = NULL)

Во-вторых, единственный способ вызвать сбой сегмента — это если что-то уже пошло не так ранее.Что происходит до этого?

Если вы не можете показать нам соответствующие фрагменты кода, то это ваша проблема.Начните комментировать фрагменты кода или иным образом изолируйте потенциальные проблемные места.Рано или поздно вы сможете свести проблему к небольшому образцу, воспроизводящему ошибку.На этом этапе проблема (и решение) может быть очевидна, а если это не так, то, по крайней мере, у вас есть пример кода разумного размера, который можно показать нам.

Я поддерживаю то, что говорит @jalf.Вы ДЕЙСТВИТЕЛЬНО уверены, что это линия, в которой произошел сбой сегмента?Это очень маловероятно.

Ошибка сегментирования возникает, когда вы пытаетесь получить доступ к памяти, на которую у вас нет разрешения.Поскольку вы не запрашиваете какую-либо конкретную память, а позволяете «новому» выделению памяти получить ее за вас, проблема должна быть в другом месте.

Что вам действительно следует сделать, так это поместить в свой код несколько операторов печати.(Я предполагаю, что вам неудобно использовать отладчик?) Это позволит вам увидеть, как далеко продвинулась программа, прежде чем произойдет ошибка сегментации.Удачи!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top