Я написал следующий аналогичный пример, когда я получаю ошибку ошибки сегментации
{
const char** var = NULL;
const char* tmp = "Hello! How are you?";
var = (const char**)malloc(5 * sizeof(char*));
for (int i = 0; i < 5; i++)
{
var[i] = (char*)malloc(50* sizeof(char));
strcpy((char*)var[i], tmp);
}
for (int i = 0; var[i]; i++)
{
std::cout << (long int)var[i] << std::endl;
std::cout << var[i] << std::endl;
}
// Free memory
....
}
И на 6-й итерации цикл for не останавливается (я ожидал, что тогда var[i]==NULL), и я получаю ошибку «Ошибка сегментации». Можете ли вы объяснить, что я делаю неправильно, пожалуйста?
Это тоже не Си. Похоже, что это C++, поэтому помечен соответствующим образом.
Почему вы ожидаете var[6] == NULL
?
Как указал Питер, из вашей памяти может быть что угодно, не обязательно NULL.
Намерение (long int)var[i]
выполнить преобразование строки в целое число или представить этот указатель как число, просто чтобы посмотреть, что это такое?
Почему var
const char**
, а не просто char**
? Эти const-приведения в вашем коде, по крайней мере, очень вводят в заблуждение (я бы сказал, ужасно).
Это выходит за конец массива:
for (int i = 0; var[i]; i++)
Доступ к var
за пределы — это поведение undefined, которое может привести к сбою. Вы не получите хорошего, аккуратного значения, когда превысите границы, как в JavaScript, Python или Ruby, у вас возникнут проблемы. К сожалению, для этого нет никаких проверок, поэтому вы должны быть бдительны, чтобы не сделать это непреднамеренно, ответственность лежит на вас.
Поскольку вы, по-видимому, используете С++, здесь можно многое исправить:
std::vector
std::string
Сочетая этот совет, вы получаете:
const std::string tmp = "Hello! How are you?";
std::vector<std::string> var;
for (int i = 0; i < 5; i++) {
var.push_back(tmp);
}
for (auto& v : var) {
std::cout << v << std::endl;
}
// No need to free memory, it's already handled for you.
Когда вы пишете на C++, попробуйте и наслаждайтесь Стандартной библиотекой. Это значительно облегчит вашу жизнь, чем использование подверженных ошибкам методик C.
Но как я могу сделать это в стиле C?
Вы делаете это очень осторожно и никогда не выходите за пределы массива. Всегда следите за максимальным индексом, который вы можете использовать. Обычно это делается с помощью переменной size
, хотя есть и другие способы, например, значения const
. Это действительно зависит от контекста.
Это как ехать по горной дороге с очень крутым обрывом с одной стороны и абсолютно без препятствий. Как не съехать с горы? Вы очень внимательно относитесь к тому, что делаете.
Где это крашится? Здесь помогает отладчик.