2013-12-05 2 views
2

Вот мой код:Как получить информацию из указателя

int *myFunction() 
{ 
    int A[3] = {1,2,3}; 
    return A;    //this will return the pointer to the first element in the array A 
} 

int main (void) 
{ 
    int A[3]; 

    A = myfunction();  //A gets the return value of myFunction 

    for(int j=0; j==2; j++) 
    { 
     B[j] = 2* A[j]; //doubles each value in the array 
    } 
    printf("%d",B); 
    return 0;  
} 

Но это не работает, потому что А, возвращается не фактический вектор. Как получить фактический вектор {1,2,3} в основной функции?

+3

Вы можете» t сделать это, потому что 'A' является локальным для' myFunction', и он заканчивается, когда 'myFunction' заканчивается, оставляя' main' с недопустимым указателем. (Также вы не объявили 'A' в' main'.) – Kninnug

+0

Попробуйте вернуть адрес A' & A', а затем использовать его вне метода. – noMAD

+0

Также будьте уверены, что ваш цикл 'for' никогда не запускается, потому что' j == 2' является ложным на первой итерации. Вероятно, вы имели в виду 'j! = 2', хотя' j <3' было бы лучше (чаще всего). – Kninnug

ответ

2

Функция myFunction выделяет A, но это распределение существует только в пределах функции scope. Когда функция возвращает память, сохраняется A. Это означает, что функция возвращает указатель на память, которая не была выделена.

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

глобальной переменной метода:

static int A[3]; 

int* myFunction() 
{ 
    A[0] = 1; A[1] = 2; //etc 
    return A; 
} 

В этом примере, потому что A является глобальным, память, на которую указывает A сохраняется Повсеместно время вашей программы на всю жизнь. Поэтому безопасно вернуть указатель на него ...

В качестве побочного примечания глобальные переменные, вероятно, не должны использоваться таким образом ... это немного неуклюже. Использование ключевого слова static означает, что A не будет доступен за пределами этого модуля (файл C).

Метод Указатель:

void myFunction(a[3]) 
{ 
    a[0] = 1; a[1] = 2; //etc 
} 

int main() 
{ 
    myA[3]; 
    myFunction(myA); 
    // and continue to print array... 
} 

В этом примере функция main() выделяет myA. Эта переменная существует во время выполнения функции (это automatic variable). Указатель на массив передается в функцию, которая заполняет массив. Поэтому функция main() может получать информацию от myFunction().

Другой способ сделать переменную myA persist заключается в том, чтобы выделить ее в кучу. Для этого вы сделаете что-то вроде int *myA = malloc(sizeof(int) * NUMBER_OF_INTS_IN_ARRAY. Эта память будет сохраняться до тех пор, пока вы ее не отсоедините, используя free() или закончите программу.

+0

«Сфера применения» - неправильный термин; область действия идентификатора, используемого внутри функции, не является проблемой. Проблема в жизни объекта. Вы можете использовать объект вне области его идентификатора, например, когда его адрес передается совершенно другой программе. Вы не можете использовать объект по истечении срока его жизни. Scope - это свойство идентификатора времени компиляции. Lifetime - это свойство времени выполнения объектов. Например, предложение «Проблема в том, что переменная' A' не сохраняется за пределами функции. »Должна быть« Проблема в том, что объект 'A' не сохраняется после выполнения функции». –

1

int A[3] = {1,2,3}; создается в стеке, это локальный массив, и его память может быть использована снова после выполнения myFunction. Вы должны либо сделать int A[3]static в пределах myFunction, либо разместив его вне всех функций. Другим вариантом было бы создать int A[3] в пределах main и передать адрес A в myFunction так myFunction может непосредственно изменить содержимое A.

0

Как есть, ваш код не близко работать в любом случае ... ваш for цикл нарушается, вы неопределенные переменные в main, у вас есть имя функции рассогласования, и ваша печать не будет делать то, что вы хотите в любом случае ...

Большая проблема, так как у вас есть неопределенное поведение, вы не можете получить доступ к A[] вне функции, где она была определена локально.Самый простой способ исправить это - использовать динамическую память для памяти A в вашем myFunction, затем используйте значения в main и free() памяти, когда вы закончите.

Вот пример фиксируя ваши другие вопросы синтаксиса:

int *myFunction() 
{ 
    int *A; 
    A = malloc(3 * sizeof(int)); 
    A[0] = 1; 
    A[1] = 2; 
    A[2] = 3; 
    return A; 
} 

int main (void) 
{ 
    int *A = myFunction();  //A gets the return value of myFunction 
    int B[3] = {0, 0, 0}; 
    int j; 
    for(j=0; j<3; j++) 
    { 
     B[j] = 2* A[j]; //doubles each value in the array 
    } 
    free(A); 
    printf("%d",B[0]); 
    return 0;  
} 
0

передать массив заполняется в качестве аргумента функции initisliser вместе с его размерами:

size_t myFunction(int * A, size_t s) 
{ 
    int A_tmp[3] = {1,2,3}; 

    size_t i = 0; 
    for (; i < s && i < sizeof(A_tmp)/sizeof(A_tmp[0]); ++i) 
    { 
    A[i] = A_tmp[i]; 
    } 

    return i; 
} 

Тогда называем его следующим образом:

int main() 
{ 
    int myA[3]; 
    size_t s = sizeof(myA)/sizeof(myA[0]); 
    size_t n = myFunction(myA, s); 
    if (n < s) 
    fprintf(stderr, "Caution: Only the first %zu of %zu elements of A were initialised.\n", n, s); 

    // and continue to print array... 
} 
0
#include <stdio.h> 

int (*myFunction(void))[3] 
{ 
    static int A[3] = {1,2,3}; 
    return &A; 
} 

int main (void){ 
    int (*A)[3], B[3]; 

    A = myFunction(); 

    for(int j=0; j<=2; j++) 
    { 
     B[j] = 2 * (*A)[j]; 
    } 
    for(int j=0; j<3;++j) 
     printf("%d ", B[j]); 
    return 0; 
} 
Смежные вопросы