2016-05-25 2 views
-3

Невозможно решить эту проблему - мой компилятор всегда говорит мне, что у меня есть проблемы со свободной (указательной) функцией. Поэтому я не уверен в работе моих указателей, но отладка показала, что на самом деле все работает хорошо. Только свободная функция не могла освободить память.Как освободить malloc вне функции

#include <stdio.h>    //Bibliothek für input/output. 
    #include <stdlib.h>    //For malloc 
    #include <math.h>    //Bibliothek für matchematische Operationen. 
    #include <iostream>    //Bibliothek für in/output in C++. 
    #include <stdbool.h>   //Bibliothek für boolean 

    //Prototypes 
int* readNumbers(int size); 
int sumUpNumbers(int* sumpointer, int size); 

//Main function 
int main() 
{ 
    int arraySize; //Size of the malloc-array 
    int* pointer; //pointer for storing of the malloc-address 
    int total;  //variable for the sumUpNumbers function 
    pointer = NULL; //point on zero 

    //inform the user before getting a number from him 
    std::cout << "Please give the size of array:" << std::endl; 
    fflush(stdout); //free the output window 
    //get a number for the size of array 
    scanf("%d", &arraySize); 

    //call the readNumbers function and store the first address of 
    //the malloc-array in pointer 
    pointer = readNumbers(arraySize); 

    //call the sumUpNumbers function and store the number in total 
    total = sumUpNumbers(pointer, arraySize); 

    fflush(stdout); //free the output window 
    //show the number from total 
    printf("\n total of the array:%d", total); 

    //call the free function for making the memory of 
    //the malloc-array free again 
    free(pointer); 

    fflush(stdin); //free the keyboard buffer 
    getchar();  //wait for a feedback from user 
    return 0;  //return 0 to the machine in case if everything works well 
} 


//This function has a pointer extension because we want to work with the 
//array outside of this function. We give the function a size of the array 
//we want to build. The function builds an array and fills it with numbers 
//and than gives us back the first address of the array. 
int* readNumbers(int size) 
{ 

    int* array;   //pointer for creating of malloc-array 
    int i;    //counter 

    //pointer for storing of the first address of the array 
    int* helpPointer; 
    array = NULL;  //set the pointers 
    helpPointer = NULL; //    on zero 

    //create the array 
    array = (int *) malloc(size * sizeof(int)); 

    //check the value of the array to be sure that we have created 
    //the array without errors 
    if(array != NULL) 
    { 
     //store the first address of the malloc-pointer 
     helpPointer = array; 
     //give some value to all the parts of array 
     for(i=0; i<=size; i++) 
     { 
      //inform the user 
      printf("\n give the %d. nummber of the array:\n", i+1); 
      fflush(stdout); //free the output window 
      //read the value 
      scanf("%d", array+i); 
     } 

     return helpPointer; //return the first address 
    } 
    //if something went wrong by creating of the array, do: 
    else 
    { 
     //tell the user, what we computer does't have enough memory 
     std::cout << "There is no place for saving the data in mamory"; 
     return 0; //return with failure 
    } 

} 

//The input of this function is a pointer with the address of the malloc-array 
//from the readNumbers and the size of this array. The function adds all the numbers 
//from the array and gives us the result of the additation back. 
int sumUpNumbers(int* sumpointer, int size) 
{ 
    int sum; //variable for storing of total value 
    int i;  //counter 
    sum = 0; //set the sum on zero before work with it 

    //count all the values from the array 
    for(i=0; i<=size; i++) 
    { 
     //count one number after another 
     sum = sum + *(sumpointer+i); 
    } 
    return sum; //return the total value 
} 
+3

'fflush (stdin);' Вызывает неопределенное поведение и может вызвать сбой программы. Вы уверены, что это не проблема? Просто удалите эту строку. – Lundin

+3

'for (i = 0; i <= size; i ++)' превышает выделенную память. Примечание. У вас нет «ошибки компилятора». Разве вы не заметили, что он просит еще одну запись, чем вы сказали? –

+2

Я уверен, что ваш компилятор не говорит вам, что у вас есть некоторые проблемы **. Конечно, это более конкретно. Кроме того, зачем использовать malloc в C++? – user2079303

ответ

2

Пределы ваших петель for неверны. Вы записываете в одну позицию в конце вашего массива, что может привести к повреждению памяти, чтобы позднее программа вышла из строя. Изменение for петли на:

for(i=0; i<size; i++) 
2

В функции readNumbers у вас есть:

for(i=0; i<=size; i++) 

но массив состоит только size элементы, так что просто изменить <= к <:

for(i=0; i < size; i++) 

У вас такая же проблема в функции sumUpNumbers. Но это скорее всего приведет к неправильной сумме, хотя это технически неопределенное поведение.

1

Ваш код имеет несколько проблем:

  1. fflush(stdin) является генератором неопределенного поведения.
  2. две неправильные счетчики: если размер size, вы должны рассчитывать for(i = 0; i < size; i++)
  3. Ваш int* readNumbers(int size) возвращает int вместо int* если array является NULL.
  4. странное смешение C и C++ без видимой причины с помощью cin и cout

Помимо написавший три очевидных ошибок (1) и (2) и (3), вы также толкать себя использовать C++ компилятор (4) для компиляции чего-то, 99% которого является простым кодом C. Зачем?

В случае замены cin и cout с соответствующими scanf() и printf() звонки, вы избавитесь от C++. Таким образом, вы можете использовать компилятор C. В этом случае не забудьте также изменить malloc вызов для того, чтобы соответствовать стандарту C:

array = malloc(size * sizeof(int)); //no result casting! 

После этого вы получите 100% код C, который легче читать, изучать и отлаживать.

+0

OP - это компиляция кода [tag: C++], поэтому значение возвращаемого значения 'malloc' является обязательным. – LPs

+0

Надеюсь, мой ответ достаточно ясен. Я посоветовал OP для возможности упрощения кода и создания его 100% ** plain C **, вместо того, чтобы использовать компилятор C++ для кода, который является ** <1% C++ **, @LPs. По какой-то причине он помечен как C, так и C++, который неоднозначен. (-: – user3078414

+0

@ user3078414, если вы добавите проблему 4 в свой список, она будет полной, я считаю. Возврат 0 в readNumbers(). При замене на возврат NULL в C, он увеличит переносимость. –

Смежные вопросы