[С++] ошибка - выход за границу памяти
эту программу ты сам писал?
черезвычайно сложно диагностировать ошибку по названию прояэкта. приведи исходники чели
да, сам. Вот с маленьким количеством чисел работает, а вот с большим нет
Расшарь исходные тексты программы, так будет проще понять, где ошибка.
Не понял, просто хотелось узнать примерно в чем загвоздка. Что значит ошибка в приложении или ошибка защиты модуля. Что за хе... такая?
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <iostream.h>
int main
{
double *a,*b,*c, *d, M, h;
int n1, n2, N, k;
printf("enter n1=");
scanf("%d",&n1);
printf("enter n2=");
scanf("%d",&n2);
N=n1*n2;
a=(double*)malloc(n1*sizeof(double;
b=(double*)malloc(n2*sizeof(double;
c=(double*)malloc(N*sizeof(double;
d=(double*)malloc(N*sizeof(double;
for(int i=1; i<=n1; i++)
{cout << "a[" << i << "]=" ;
cin >> a[i];}
for(int i=1; i<=n2; i++)
{cout << "b[" << i << "]=" ;
cin >> b[i];}
k=1;
for(int i=1; i<=n1; i++)
for(int j=1; j<=n2; j++)
{c[k]=a[i]-b[j];
k++;
}
//for(int i=1; i<= N; i++)
//cout << "c[" << i << "]=" << c[i]<<endl;
for(int j=1;j<=N-1;j++)
{
for(int i=j+1; i<=N;i++)
{if(c[j]<c[i]){h=c[i];c[i]=c[j];c[j]=h;}}
d[j]=c[j];
}
d[N]=c[N];
// for(int i=1; i<= N; i++)
//cout << "d[" << i << "]=" << d[i] << endl;
if(fmod(N,2)==0.0) M=doubled[N/2]+d[N/2+1])/2);
else M=d[(N+1)/2];*/
cout << "mediana=" << M;
return 0;
}
вот такая прога
a=(double*)malloc(n1*sizeof(double;Выход за границы массива, это же очевидно... Ты на паскале раньше писал, что-ли?
for(int i=1; i<=n1; i++)
Да, и как-то совсем некрасиво смотрится смешивание scanf+printf и cin+cout. Уж на чём-нибудь одном остановись....
for(int i=1; i<=n1; i++)
это ж тебе не Паскаль!
ps. чорт, опоздал
Да, я так походу писал, а потом вспомнил про сиаут и сиин А не понял что за границу выходит, вроде же все норм?
т е до n1 не включ-но?
Спасибо за подсказку!
Ошибка возникает у тебя по всей видимости вследствие обращения за пределы выделенной области памяти (скорее всего через NULL pointer, возвращенный malloc-ом, которому не хватило памяти). Ну и насчет выхода за пределы выделяемого массива, тоже правильно заметили предыдущие ораторы.
Да, я так походу писал, а потом вспомнил про сиаут и сиин А не понял что за границу выходит, вроде же все норм?В языках C/C++/Java/PHP и многих других элементы массива с N элементов нумеруются от 0 до N-1 включительно, и это, на самом деле, очень логично. Я так понимаю, что с этими языками ты раньше не работал, поэтому рекомендую книжку какую-нибудь сказать, благо таких навалом - иначе рискуешь получить много неадекватных и не самых дружелюбных постов в ответ
Да, спаибо! А что стесняться все свои
Изучи языки внимательно, особенно их стандартные возможности.
В частности внимательно прочитай как работает malloc и проверяй его возврат.
Да, я вспомнил про нумерацию. Вот что значит долго не програмировать Как говорится: плохо, когда не знал да и еще забыл
Исправил. Все считает! Только вот потом опять эту ошибку выводит. Хорошо хоть результат показывает Все покажет, а потом ошибка выходит Это нормально? Вроде нет, а что сделать?
Черт. Ошибся не все считает теперь ошибка 0002:01А0
маллоки на нул проверил?
Все! Наконец-то! Теперь без "лишних надписей" считает. Спасибо
Исправил. Все считает! Только вот потом опять эту ошибку выводит. Хорошо хоть результат показывает Все покажет, а потом ошибка выходит Это нормально? Вроде нет, а что сделать?
Все! Наконец-то! Теперь без "лишних надписей" считает. Спасибо
Ты сам с собой общаешься?
Маза в том, что отцы иногда рекомендуют воздерживаться от проверки возврата malloc`а. Потому как успешный возврат ничего не гарантирует.
Поэтому лучше calloc вызывать. По крайней мере, в Linux он гарантирует реальное выделение памяти. А вот во Фре - фигня, успешный вызов calloc ничего не означает.
В man об этом ни слова.
На самом деле, гарантировать реальную доступность выделенной памяти пытается ядро, если включить строгую политику учёта.
Специально не проверять код возврата malloc - глупость, особенно если большой кусок выделяешь (больше страницы).
В мане возможно нет. Но в целом, наблюдалась ситуация, когда calloc вел себя именно таким способом - в Linux при нехватке памяти возвращал NULL, а в FreeBSD делал вид, что все ок, а потом, при очередном обращении к индексу, приводящему к физическому выделению памяти, прога падала.
Маза в том, что отцы иногда рекомендуют воздерживаться от проверки возврата malloc`а. Потому как успешный возврат ничего не гарантирует.Боюсь, что эти отцы, как бы так выразиться, на самом деле псевдоотцы.
Тот факт, что возврат NULL заведомо гарантирует то, что память не выделена, уже явлется достаточным основанием, чтобы делать проверку.
В любом случае наличие проверки заведомо лучше ее отсутствия.
Успешный возврат совместимого со стандартом malloc-а гарантирует в точности то, что написано в стандарте.
Уж конечно программист должен рассчитывать на то, что если уж он пишет C прогу, то основная стандартная функциональность ему доступна. (по крайней то, что широко используется)
Маза вот в чем:
ISO 9899-1999:
7.20.3 Memory management functions
1 The order and contiguity of storage allocated by successive calls to the calloc,
malloc, and realloc functions is unspecified. The pointer returned if the allocation
succeeds is suitably aligned so that it may be assigned to a pointer to any type of object
and then used to access such an object or an array of such objects in the space allocated
(until the space is explicitly deallocated). The lifetime of an allocated object extends
from the allocation until the deallocation. Each such allocation shall yield a pointer to an
object disjoint from any other object. The pointer returned points to the start (lowest byte
address) of the allocated space. If the space cannot be allocated, a null pointer is
returned. If the size of the space requested is zero, the behavior is implementation-
defined: either a null pointer is returned, or the behavior is as if the size were some
nonzero value, except that the returned pointer shall not be used to access an object.
7.20.3.3 The malloc function
Synopsis
1 #include <stdlib.h>
void *malloc(size_t size);
Description
2 The malloc function allocates space for an object whose size is specified by size and
whose value is indeterminate.
Returns
3 The malloc function returns either a null pointer or a pointer to the allocated space.
Тот факт, что возврат NULL заведомо гарантирует то, что память не выделена, уже явлется достаточным основанием, чтобы делать проверку.
В любом случае наличие проверки заведомо лучше ее отсутствия.
ОК, согласен
Уж конечно программист должен рассчитывать на то, что если уж он пишет C прогу, то основная стандартная функциональность ему доступна. (по крайней то, что широко используется)
Не согласен
man malloc
BUGS
By default, Linux follows an optimistic memory allocation strategy.
This means that when malloc returns non-NULL there is no guarantee
that the memory really is available. This is a really bad bug. In case
it turns out that the system is out of memory, one or more processes
will be killed by the infamous OOM killer. In case Linux is employed
under circumstances where it would be less desirable to suddenly lose
some randomly picked processes, and moreover the kernel version is suf-
ficiently recent, one can switch off this overcommitting behavior using
a command like
# echo 2 > /proc/sys/vm/overcommit_memory
See also the kernel Documentation directory, files vm/overcommit-
accounting and sysctl/vm.txt.
С чем конкретно ты не согласен?Уж конечно программист должен рассчитывать на то, что если уж он пишет C прогу, то основная стандартная функциональность ему доступна. (по крайней то, что широко используется)Не согласен
man malloc
(1) Весьма очевидно, что я не утверждал о том, что все реализации стандартной библиотеки совместимы со стандартом. Я лишь утверждал, что пользователь, использующий функции стандартной библиотеки, должен рассчитывать на стандартную функциональность оных, либо использовать платформозависимые системные функции.
(2) То что описано в "man malloc" - это вообще не баг, а фича, которая строго говоря не противоречит стандартной функциональности malloc. (И тем более ее можно отключить, как написано в man.) Вот в чем прикол: линукс логически выделяет блок памяти (т.е. malloc успешно отработал и память выделена, как и требует стандарт но если в момент первого использования этого блока недостаточно памяти в системе, то ядро убивает какой-то процесс (как и написано в man но вовсе не обязательно этот, например если этот процесс имеет больший приоритет чем какой-то другой, то не исключено, что умрет другой. Это средство борьбы с DoS атаками, когда непривилегированный процесс занимает собой всю память, мешая работать более привелигированным процессам. Ясно же, что независимо от требований стандарта, процесс может быть убит в любой момент: либо вручную, либо автоматически при каких-либо условиях. И наверно линукс успешно не выделит блок размером более чем общее количество доступной в userspace памяти (включая swap).
Давайте теперь вообще ничего не проверять, всё равно же останутся ошибки.
Если ты не можешь написать идеальную программу (которую никто не сможет написать пиши не кривую, а наиболее близкую к этому идеалу.
Если ты не можешь написать идеальную программуТо вообще нефиг писать
Оставить комментарий
wtopolov
Кто-нибудь знает что это за ошибка: PROJ0005 вызвал общую ошибку защиты в модуле PROJ0005.exe в 0005:0335? Если кто знает как исправить, подскажите. Спасибо.