Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
vog
1 / 1 / 0
Регистрация: 22.01.2015
Сообщений: 34
#1

Что может означать такая ошибка: "Heap corruption detected" - C (СИ)

24.01.2015, 19:32. Просмотров 871. Ответов 10
Метки нет (Все метки)

Что может означать такая ошибка?
переполнение памяти?
0
Миниатюры
Что может означать такая ошибка: "Heap corruption detected"  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2015, 19:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Что может означать такая ошибка: "Heap corruption detected" (C (СИ)):

HEAP CORRUPTION DETECTED - C (СИ)
На строчке 36 с очисткой памяти постоянно вылетает ошибка дебага :( HEAP CORRUPTION DETECTED after Normal block (#202) at 0x000B6A58 ...

Heap corruption detected - C (СИ)
В процессе разработки получилась интересная ситуация. Есть такой код char **map; map = (char**)calloc(mapYsize, sizeof(char*)); ...

Задача на работу с динамическим массивом. HEAP CORRUPTION DETECTED - C (СИ)
Не понимаю причину ошибки. Подскажите пожалуйста. // pmArray.cpp : Defines the entry point for the console application. // ...

Функция замены ":" на "_" в названии файла и ошибка "undefined reference to 'strcat'" - C (СИ)
Добрый день,прошу помочь мне с такой проблемой: В общем есть функция,работающая с именем файла,которая меняет в имени файла ":" на "_" ...

Создать запись "Двигатель", которая содержит элементы "Название", "Мощность", "Скорость", "Цена" - C (СИ)
Создать запись "Двигатель", которая содержит элементы "Название", "Мощность", "Скорость", "Цена". На основе записи "Двигатель" создать...

Сортировка подсчетом и ошибка "Невозможно преобразовать "void*" в "int*" - C (СИ)
Мне нужно отсортировать одномерный массив с помощью алгоритма сортировки, однако возникает ошибка "error C2440: инициализация: невозможно...

10
Tordek
55 / 49 / 18
Регистрация: 22.01.2015
Сообщений: 176
24.01.2015, 20:27 #2
Если верить интернету, такое происходит скорее при порче памяти, например, когда ты обращаешься вне цикла или дважды "удаляешь" один и тот же элемент. Скинь код и тебе помогут, так сказать ничего нельзя точно. Кстати, мог бы и сам прогуглить.
0
vog
1 / 1 / 0
Регистрация: 22.01.2015
Сообщений: 34
24.01.2015, 20:52  [ТС] #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <string.h> 
#include <math.h>
#include <iostream>
using namespace std; 
#include <iomanip> //для setprecision()
#define N 1000
const double pi = acos(-1.0);
 
typedef struct 
{
    double re;
    double im;
}complex;
 
int ReadFromFile (double* data)
{
    char finame[10];
    int i,n=0;
    cout << "Введите имя файла:" << endl;
    cin >> finame;
    FILE *f = fopen(finame, "r");
    if (f == NULL)
        cerr << "Ошибка чтения файла." << endl;
    else
    {
        fscanf(f, "%d", &n);
        for (i=0; i < n; i++)
        {
            fscanf(f, "%lf", &data[i]);
        }
    }
    fclose(f);
return n;
}
 
complex Trig(double u,double pwr)
{
    complex arg = {0};
    arg.re = cos(u*pwr);
        arg.im = sin(u*pwr);
return arg;
}
 
complex csum(complex val1, complex val2)
{
    val1.re = val1.re +val2.re;
val1.im = val1.im +val2.im;
    return val1;
}
//считаем суммубольшую комплексных чисел, для каждой u отправляем сюда, посчитать сумму по количеству элементов выборки
complex SUMTRIG(double u, int n,double* data)
{
    complex two1={0},two2={0};
    int i;
    for (i=0; i < n; i++)
        {
            two1 = Trig(u, data[i]);//получаем комплексное число cos(ux)+isin(ux)
            two2 = csum(two1,two2);//прибавляем к предыдущему, чтобы получить сумму от 1 до n, для одной u
        }
    return two2;
}
 
 
complex cmult(complex val, double p)
{
    val.re *= p;
    val.im *= p;
    return val;
}
int EMP(complex *result, int n, double* data)
{
double g,u;
int i=0;
complex sum={0};
g=1.0/n;
 
for ( u=-pi ; u<=pi; u+= 1.0)
    {
        sum = SUMTRIG(u, n, data);
        sum = cmult(sum,g);
        printf("sum[i]= %lf ",sum.re);
        //не нравится ему каут cout << "sum[i]= " << sum.re;
        result[i].re = sum.re;
        result[i].im = sum.im;
        i=i+1;
    }
return i;
}
 
/*void show(complex *val,int n)
{int i;
    for(i=0;i<n;i++)
    {
    cout << "g = ";
    if(0 <= val[i].re)
        cout << " ";
    cout << fixed << setprecision(3) << val[i].re;
    if(val[i].im < 0)
        cout << " - i*";
    else
        cout << " + i*";
        cout << fixed << setprecision(3) << fabs(val[i].im) << endl;//?
    }
}*/
void show(complex *val,int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("g = ");
    if(0 <= val[i].re)
        printf(" ");
    printf("%.3f",val[i].re);
    if(val[i].im < 0)
        printf(" - i*");
    else
        printf(" + i*");
    printf("%.3f", fabs(val[i].im));
    }}
 
void main()
{
setlocale(LC_CTYPE, "Russian");
int m=0,reskol=0;
double *mas= new double [m];//здесь что m=0 изначально? это вообще законно?
complex *em = new complex [N];
m = ReadFromFile (mas);
reskol=EMP(em, m, mas);
show(em,reskol);
delete [] mas;
delete [] em;
_getch();
}
0
Tordek
55 / 49 / 18
Регистрация: 22.01.2015
Сообщений: 176
24.01.2015, 22:55 #4
Ошибка в 24 строке

Добавлено через 32 секунды
Адресс файла - Ансистринговая переменная, в кавычках её надо

Добавлено через 1 минуту
И еще n у тебя изначально равна нулю.Как в 30 строке может существовать такой цикл?
Цитата Сообщение от vog Посмотреть сообщение
for (i=0; i < n; i++)
Добавлено через 14 минут
А, нет, с циклом всё норм, но в адресе должна стоять строка типа Ansistring, ты же передаёшь чаровую
0
Байт
Эксперт C
17713 / 11734 / 1871
Регистрация: 24.12.2010
Сообщений: 23,528
24.01.2015, 23:41 #5
Цитата Сообщение от Tordek Посмотреть сообщение
Адрес файла - Ансистринговая переменная, в кавычках её надо
Это, простите, полная ерунда. Имя файла в функции fopen(char *name, char *mode) именно чаровая строка. И никаких кавычек там не надо. Это я к тому, чтобы ТС не искал ошибки там, где их нет. Наверное, они есть, но в другом месте.

Добавлено через 4 минуты
Цитата Сообщение от vog Посмотреть сообщение
fclose(f);
Опа! Одну ошибочку нашел (строчка 35) Закрытие файла происходит даже если он не открылся. Втащи ее под else.

Добавлено через 5 минут
Цитата Сообщение от vog Посмотреть сообщение
double *mas= new double [m];//здесь что m=0 изначально? это вообще законно?
Нет, не законно. Это - преступно! Сначала определи m, а потом уж и память выделяй.
ЗЫ. Это то, что найдено просмотром кода по диагонали. Навярняка, есть и еще ошибки
0
Tordek
55 / 49 / 18
Регистрация: 22.01.2015
Сообщений: 176
25.01.2015, 01:46 #6
Цитата Сообщение от Байт Посмотреть сообщение
Это, простите, полная ерунда. Имя файла в функции fopen(char *name, char *mode) именно чаровая строка.
Перепутал, прошу простить.
Цитата Сообщение от Байт Посмотреть сообщение
Цитата Сообщение от vog Посмотреть сообщение
fclose(f);
Опа! Одну ошибочку нашел (строчка 35) Закрытие файла происходит даже если он не открылся. Втащи ее под else.
А вот тут вы проглядели - закрытие произошло уже вне else, так что всё легально.

Добавлено через 2 минуты
Цитата Сообщение от Байт Посмотреть сообщение
double *mas= new double [m];//здесь что m=0 изначально? это вообще законно?
Нет, не законно. Это - преступно! Сначала определи m, а потом уж и память выделяй.
m определён, но как 0. Что же это за массив с 0 элементами?
0
vog
1 / 1 / 0
Регистрация: 22.01.2015
Сообщений: 34
25.01.2015, 08:07  [ТС] #7
Переопределил
в строке
C
1
double *mas= new double [m];
на
C
1
double *mas= new double [M];
и вначале добавил
C
1
#define M 500;
вроде без ошибок выдает,
Спасибо всем за участие
0
Байт
Эксперт C
17713 / 11734 / 1871
Регистрация: 24.12.2010
Сообщений: 23,528
25.01.2015, 10:46 #8
Цитата Сообщение от Tordek Посмотреть сообщение
закрытие произошло уже вне else,
Вот именно. Смотри.
C
1
2
3
4
5
f = fopen("ffff", "r");
if (f!=NULL) {
   ....
}
fclose(f);
Ну и что получится, если файл ffff не существует?
0
Tordek
55 / 49 / 18
Регистрация: 22.01.2015
Сообщений: 176
25.01.2015, 14:32 #9
То он и не откроется, разве нет? Указатель-то файловый будет=NULL
0
Байт
Эксперт C
17713 / 11734 / 1871
Регистрация: 24.12.2010
Сообщений: 23,528
25.01.2015, 15:18 #10
Цитата Сообщение от Tordek Посмотреть сообщение
Указатель-то файловый будет=NULL
Во-во! А fclose не проверяет, как и большинство родных сишных функций, какой указатель ему передан. И начинает шебуршить что-то с памятью по нулевому указателю.
Впрочем, чего спорить. Напиши простую программку
C
1
2
FILE *f=NULL;
fclose (f);
И посмотри, что получится...
0
Tordek
55 / 49 / 18
Регистрация: 22.01.2015
Сообщений: 176
25.01.2015, 15:23 #11
Цитата Сообщение от Байт Посмотреть сообщение
Впрочем, чего спорить. Напиши простую программку
C++
1
2
FILE *f=NULL;
fclose (f);
И посмотри, что получится...
Написал, и никакой ошибки не получил, так что..
0
25.01.2015, 15:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2015, 15:23
Привет! Вот еще темы с ответами:

Ошибка в 3 строчках: Синтаксическая ошибка: отсутствие ";" перед "тип" - C (СИ)
Вот написал я: #include &quot;locale.h&quot; int main() { setlocale(LC_ALL, &quot;&quot;); char *str = &quot;образец&quot;; return 0; ...

VS2013 выдаёт ошибку Ошибка 1 error C2079: "d" использует неопределенный struct "DATE" - C (СИ)
Привет всем. Подскажите пожалуйста, почему VS2013 выдаёт ошибку Ошибка 1 error C2079: &quot;d&quot; использует неопределенный struct...

Динамическая память. Ошибка С2143 пишет отсутствие ";" перед "тип" (Visual Studio 2010) - C (СИ)
Это код filesIO.c Чтение данных для выч. модуля программы из файла (вектора X, чисел N, M; inNm - имя файла). Там 2 строчки...

Списки. Ошибка "используется потенциально неинициализированная локальная переменная-указатель "t"" - C (СИ)
В 35-й выдает ошибку &quot;используется потенциально неинициализированная локальная переменная-указатель &quot;t&quot;&quot; Цель программы. Используя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru