#c #указатели #память #динамические_массивы
Доброго времени суток! Приведу пример кода, в котором укажу лишь те места, где выделяется
непосредственно память. Заранее удалю все места, где я эту память освобождаю, чтобы
вы, как более опытные программисты в Си, чем я, начинающий, указали мне, как лучше
следует с ней обращаться, а главное - показали, из-за чего всё-таки у меня программа
в процессе выполнения вылетает с ошибкой .exe вызвал срабатывание точки останова.
Итак, сам код:
void func(int *intArray, int mode, int length, int **p, int **hufTemp,
int *num)
{
int *intPtrTemp;
int *intListTemp, *intListIndexes;
int *intPtrLength, *intPtrLength_Temp;
int *intPtrBlCount;
int *intPtrNextCode;
int *intPtrHuffmanTree;
int *intDictHuffmanTree;
int count = 0 , max = 0;
intPtrTemp = (int*)malloc(length * sizeof(int));
memset(intPtrTemp, 0, length * sizeof(int));
memcpy(intPtrTemp, intArray, length * sizeof(int));
// процесс вычисления count
intListTemp = (int*)malloc(count * sizeof(int));
intListIndexes = (int*)malloc(count * sizeof(int));
memset(intListTemp, 0, count * sizeof(int));
memset(intListIndexes, 0, count * sizeof(int));
intPtrLength = (int*)malloc(count * sizeof(int));
memset(intPtrLength, 0, count * sizeof(int));
memcpy(intPtrLength, intListTemp, count * sizeof(int));
intPtrLength_Temp = (int*)malloc(count * sizeof(int));
memset(intPtrLength_Temp, 0, count * sizeof(int));
memcpy(intPtrLength_Temp, intPtrLength, count * sizeof(int));
// процесс вычисления max
memcpy(intPtrLength_Temp, intPtrLength, count * sizeof(int));
intPtrBlCount = (int*)malloc((max + 1)*sizeof(int));
memset(intPtrBlCount, 0, (max + 1) * sizeof(int));
intPtrNextCode = (int*)malloc((max + 1) * sizeof(int));
memset(intPtrNextCode, 0, (max + 1) * sizeof(int));
intPtrHuffmanTree = (int*)malloc(count * sizeof(int));
memset(intPtrHuffmanTree, 0, count * sizeof(int));
intDictHuffmanTree = (int*)malloc(count * sizeof(int));
memset(intDictHuffmanTree, 0, count * sizeof(int));
memcpy(*p, intPtrLength, count * sizeof(int));
memcpy(*hufTemp, intDictHuffmanTree, count * sizeof(int));
*num = count;
}
void main()
{
char **dictFirstHuffmanTree;
int intHuffmanTree_Init[19];
int *p, *_intHuffmanTree, count = 0;
// вычисление элементов массива intHuffmantree_Init
p = (int*)malloc(sizeof(int));
_intHuffmanTree = (int*)malloc(sizeof(int));
func(intHuffmanTree_Init, 1, 19, &p, &_intHuffmanTree, &count);
dictFirstHuffmanTree = (char**)malloc(count * sizeof(char*));
getchar();
}
Пара важных моментов.
1. Функция содержится в файле test1.c. Дёргаю я её из файла test2.c.
2. Если всё писать в одном файле, вот так как я представил (т.е. без освобождения
памяти), то всё прекрасно работает.
Ответы
Ответ 1
Как минимум: p = (int*)malloc(sizeof(int)); Теперь p указывает на блок в 4 байта (ну, чтоб не писать sizeof(int), пусть 32-разрядная программа). Передаете его в функцию. Значение p не меняется, теперь это *p - раз в функцию передан адрес p. И в этот блок вы копируете незнамо сколько памяти: memcpy(*p, intPtrLength, count * sizeof(int)); Если count больше 1, вы выходите за рамки выделенного блока и перезаписываете служебные структуры менеджера памяти. Я не говорю, что это единственная ошибка, но дальше я не смотрю - пока что нет смысла... И вы как, ничего не освобождаете выделенного? Устраиваете себе утечку памяти?
Комментариев нет:
Отправить комментарий