LINUX.ORG.RU

malloc и segfault =((((


0

0

возникла следующая проблема: выделяю дин. массив n на n bool ** graph_prot = ( bool ** ) malloc( n * sizeof( bool * ) ); for ( int i = 0; i < n; i ++ ) graph_prot[ i ] = ( bool * ) malloc( n * sizeof( bool ) ); в описании метода обращаюсь к всем его ячейкам for ( int i = 0; i < n; i ++ ){ for ( int j = 0; j < т; j ++ ){ cout << " " << graph_prot[ i ][ j ]; но при вызове вместо cout << " " << graph_prot[ i ][ j ]; проверки например if (graph_prot[ i ][ j ]) cout << "works!!!"; вылетает с ошибкой сегфолт с указанием на эту строчку =(

использую MinSYS(1.0.10) и MinGW(3.1.0), g++.exe (GCC) 3.2.3 (mingw special 20030504-1) компилю так: g++ Wall -g -c infpot.cpp g++ Wall -g infpot.o -o infpot

★★

блин форматирование....

возникла следующая проблема: выделяю дин. массив n на n

bool ** graph_prot = ( bool ** ) malloc( n * sizeof( bool * ) );

for ( int i = 0; i < n; i ++ )

graph_prot[ i ] = ( bool * ) malloc( n * sizeof( bool ) );

в описании метода обращаюсь к всем его ячейкам

for ( int i = 0; i < n; i ++ ){

for ( int j = 0; j < т; j ++ ){

cout << " " << graph_prot[ i ][ j ]; }}

но при вызове вместо cout << " " << graph_prot[ i ][ j ]; проверки например

if (graph_prot[ i ][ j ])

cout << "works!!!";

вылетает с ошибкой сегфолт с указанием на эту строчку =(

использую MinSYS(1.0.10) и MinGW(3.1.0), g++.exe (GCC) 3.2.3 (mingw special 20030504-1) компилю так:

g++ Wall -g -c infpot.cpp

g++ Wall -g infpot.o -o infpot

ale ★★
() автор топика
Ответ на: комментарий от ale

Н-ну... Во-первых (типа придирка :)), неплохо бы проверять результат malloc на NULL; во-вторых, судя по букве "т" вместо "n", этот кусочек ты набирал руками. Покажи лучше именно тот код, который компилируешь и который не работает.

jek_
()
Ответ на: комментарий от ale

Вылезаеш за границы массива. Скорей всего индекс j у тебя больше чем элементов в массиве.

А вообще совет: юзай vector и итераторы вместо массивов :)

Esh ★★★★
()
Ответ на: комментарий от jek_

>Н-ну... Во-первых (типа придирка :)), неплохо бы проверять результат malloc на NULL;

Можно вопрос глупый: зачем malloc то на NULL проверять? AFAIK если malloc не может выделить память, то в лучшем случае - системе кранты. :-(

human0id ★★★
()
Ответ на: комментарий от human0id

human0id ты то-же анекдоты на С пишешь ?

cat test.c

#include <stdio.h>
#include <stdlib.h>
int main()
{
void* p = malloc(-1);
if (p == NULL) printf ("NULL\n");
return 0;
}

gcc test.c -o test
./test
NULL

Это как же это пишет NULL а системе не кранты ? Наверно это магия !!!
Всегда, ВСЕГДА !!! нужно проверять возвращаемые значения в том случае
если эти значения могут сигнализировать об ошибке !

anonymous
()
Ответ на: комментарий от human0id

>Можно вопрос глупый: зачем malloc то на NULL проверять? AFAIK если malloc не может выделить память, то в лучшем случае - системе кранты. :-(

Какой именно системе? ;-)

Да и обсуждали этот вопрос уже не раз вроде как в этом форуме.

Dead ★★★★
()
Ответ на: комментарий от anonymous

>Это как же это пишет NULL а системе не кранты ? Наверно это магия !!! Всегда, ВСЕГДА !!! нужно проверять возвращаемые значения в том случае если эти значения могут сигнализировать об ошибке !

никто и не спорит что нужно проверять, в твоем же случае все надуманно, а какже malloc(0) к примеру ? - отчего зависит знаешь? от реализации mm. и будешь проверять что?

Далее если malloc() возвращает NULL , значит в системе вообще нет памяти свободной - это во первых редкий случай, во вторых это значит что спокойно можно завершать процесс в этом случае.

Да и не факт что если тебе malloc вернул указатель то при обращении к нему ты не получишь segfault ;-) это камень в сторону mm в linux.

Еще можешь надумать случай выделения 3Гб в системе где всей памяти 2Гб - но это опять же несерьезно =)

alphex_kaanoken ★★★
()
Ответ на: комментарий от human0id

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

Keiko
()
Ответ на: комментарий от Keiko

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

ИМХО в таких случаях надо проверять это значение - результат malloc проверять как обычно как и везде.

alphex_kaanoken ★★★
()
Ответ на: комментарий от alphex_kaanoken

я про то и говорю. Мысль "зачем malloc то на NULL проверять" катит только для лабораторных и курсовых по транспонирования матриц :)

Keiko
()
Ответ на: комментарий от Keiko

>Мысль "зачем malloc то на NULL проверять" катит только для лабораторных >и курсовых по транспонирования матриц :)
Вот только не понять этого разработчикам анекдотов :)))

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.