#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, вы выходите за рамки выделенного блока и перезаписываете служебные структуры менеджера памяти. Я не говорю, что это единственная ошибка, но дальше я не смотрю - пока что нет смысла... И вы как, ничего не освобождаете выделенного? Устраиваете себе утечку памяти?
Комментариев нет:
Отправить комментарий