2014-02-15 4 views
0

Мне нужно сделать простую программу, которая делает новый массив, состоящий из элементов sqrt-ed из первого массива. Я должен написать элементы нового массива в основном. Я пытался отлаживать свой код, а переменные x и y отображают хорошие числа (я инициализировал их только для того, чтобы я мог наблюдать прогресс на отладчике), но когда я пытаюсь написать элементы моего нового массива, он показывает некоторые странные числа. Может ли какая-то хорошая душа объяснить мне, что я делаю неправильно?C печать значения указателя двойного типа не работает

void returnSqrtArrayt(int* myArray, int length, double** newArray) 
{ 
    int i; 
    double x, y; 
    double* p; 
    double* arraySqrt=(double*)malloc(length*sizeof(double)); 
    for(i=0;i<length;i++) 
    { 
     x=*myArray; 
     *arraySqrt=sqrt(x); 
     y=*arraySqrt; 
     myArray++; 
     arraySqrt++; 
    } 

    *newArray=arraySqrt; 

    p=arraySqrt; 

    for(i=0;i<length;i++) 
    { 
     printf("%e\n",*p); 
     p++; 
    } 
    printf("\n"); 
} 

void main() 
{ 
    int myArray[5]={4,2,16,4,81}; 
    int length=sizeof(myArray)/sizeof(int); 
    int i; 
    double* newArray; 

    returnSqrtArrayt(myArray, length, &newArray); 

    for(i=0;i<length;i++) 
    { 
     printf("%e\n",*newArray); 
     newArray++; 
    } 
} 
+0

'двойной * arraySqrt = (двойной *) таНос (длина * SizeOf (двойной));' не правильно. Это хорошая причина, чтобы [не отбрасывать возвращаемое значение malloc] (http://stackoverflow.com/a/954785/817643). – StoryTeller

+0

Вы не должны делать 'newArray ++;', вы немедленно потеряете свою ссылку на память, которую вы выберете 'malloc()' ed, и вы не сможете использовать эти элементы снова, если вы не создадите резервную копию , –

+1

@StoryTeller: вызов 'malloc()' отлично, кроме литых. –

ответ

2

Что вы испытываете, неопределенного поведения потому что вы делаете:

void returnSqrtArrayt(int* myArray, int length, double** newArray) 
{ 
    ... 
    double* arraySqrt= malloc(...);   // create new array 

    for(i=0;i<length;i++) 
    { 
     ... 
     arraySqrt++;      // increment pointer to this array 
    } 

    *newArray=arraySqrt;     // use incremented pointer 

    // any use of *newArray or arraySqrt here tries to access incorrect memory ! 
} 
Это хорошо, что вы используете временный указатель p для печати, так как увеличивающиеся p не влияет на оригинальный указатель, но попробовать следующие изменения:
  • do *newArray=arraySqrt; сразу после malloc позвонить
  • вместо p=arraySqrt; использования p=*newArray; во время печати внутри функции
+0

Спасибо вам большое! Сейчас работает как шарм :) –

+0

@ MahirDuraković: Добро пожаловать :) – LihO

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