C ++: второй раз вызывает функцию, но все равно влияет на мой предыдущий указатель - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть пользовательская функция, которая будет возвращать объект Array.

Я вызываю функцию в main (), как показано ниже

int * FirstPointer = customFunction(123456);

но при повторном использовании функции

int * SecondPointer = customFunction(23);

это повлияет на мой FirstPointer, который отправляет возвращаемый массив со второго раза, когда я вызываю функцию FirstPointer.

Почему ???

это моя пользовательская функция

//Description : integerSplitter(int x) function take in integer value 
//              and return an array object that contain the integer value ONE digit by ONE digit in array object.
//              !! The returned array object is zero-base.
//Example       : int* myObjectPointerName = integerSplitter(8912341379)
//              cout<<myObjectPointerName[0]<<myObjectPointerName[3];
//Creator     : kent.jr@me.com

int* integerSplitter(int x) { 

    int myInteger = x;
    myInteger = x;

    int myIntegerCounter = 0;
    myIntegerCounter = 0;

    int myDivider = 1;
    myDivider = 1;

    while(myInteger>=1) { 
        myInteger /= 10;
        myIntegerCounter++;
    }

    //for most of the compiler
    int* myIntegerArray;
    myIntegerArray = new int[myIntegerCounter];

    /*
    //for LLVM compiler
    int myIntegerArray[myIntegerCounter];
    */
    /*
    //for GCC Compiler
    //const int constMyIntegerCounter = myIntegerCounter;
    int* myIntegerArray = new int[ constMyIntegerCounter ];
    */

    myInteger = x;
    while(myIntegerCounter >= 1) {
        myIntegerCounter--;
        myIntegerArray[myIntegerCounter] = (myInteger/myDivider)%10;
        myDivider *= 10;
    }


    //The above while statement will automatically carry out the below statement
    //....
    //....
    //myIntegerArray[0] = (myInteger/10000000)%10;
    //myIntegerArray[1] = (myInteger/1000000)%10;
    //myIntegerArray[2] = (myInteger/100000)%10;
    //myIntegerArray[3] = (myInteger/10000)%10;
    //myIntegerArray[4] = (myInteger/1000)%10;
    //myIntegerArray[5] = (myInteger/100)%10;
    //myIntegerArray[6] = (myInteger/10)%10;
    //myIntegerArray[7] = (myInteger/1)%10;

    return myIntegerArray;
}

Ответы [ 3 ]

3 голосов
/ 16 февраля 2012

Поскольку функция возвращает указатель на статический массив int (другими словами, возвращаемый указатель является одинаковым адресом памяти каждый раз). Вам нужно исправить cusctomFunction, чтобы вместо этого каждый раз возвращать вновь выделенный массив.

1 голос
/ 16 февраля 2012

Во-первых, то, что вы пытаетесь сделать, может быть достигнуто с помощью чистого C ++, поэтому использование разных путей кода для разных компиляторов не очень хорошая идея. Следующее, что вы должны сказать нам, под каким компилятором это не получается.

Я могу вам сказать, что в версии LLVM это, безусловно, завершится ошибкой, поскольку вы возвращаете указатель на первый элемент локального массива, который становится недействительным сразу после оператора return. GCC и большинство других должны работать, хотя.

Теперь я бы порекомендовал вместо использования простых массивов создать вектор внутри себя и вернуть его. Это избавит вас от необходимости вручную управлять памятью (если вы динамически распределяете массив) или от других проблем, подобных той, с которой вы столкнулись.

0 голосов
/ 16 февраля 2012

Что конкретно делает / возвращает ваш customFunction()? Если возвращаемый адрес всегда один и тот же, оба ваших указателя будут естественно указывать на одну и ту же ячейку памяти.

...