Использование указателя для сохранения данных, которые возвращаются из функции в c - PullRequest
0 голосов
/ 15 мая 2019
  1. Когда мы хотим вернуть один конкретный тип данных, нам нужно сначала объявить глобальную переменную, верно? и присвоить эту переменную значению, которое возвращается функцией?

  2. Также для типа int int мы не можем использовать malloc для резервирования блока памяти?

С уважением, полный сомнений.

#include <math.h> 
#include <stdio.h> 

int *sum(); 
int main() 
{ 
    int *num; 
    num = sum(); 
    printf("\nSum of two given values = %d", *num); 
    return 0; 
} 

int *sum() 
{ 
    int a = 50, b = 80;
    int *sum = NULL; 
    printf("%d %d",a,b);
    *sum = a+b; 
    return sum; 
} 

Я хочу использовать указатели для сохранения данных, возвращаемых функцией. Является ли это возможным? Я знаю, что это возможно для связанных структур списков. Но я не уверен насчет целых чисел и других примитивных типов данных.

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Начиная со второго вопроса, вы можете использовать malloc для выделения памяти любого размера для любого типа переменной.Да, вы можете использовать malloc для распределения целых и других примитивных типов в куче.

int i_am_a_stack_variable = 1;
int * i_am_a_pointer_to_heap_memory = malloc(sizeof(int));

По первому вопросу, я думаю, вы неправильно понимаете, как работают возвращаемые переменные.Как правило, следует избегать использования глобальных переменных.Они, конечно, не нужны для возврата значений из функций.Возвращаемое значение функции копируется из кадра стека функции обратно в кадр вызывающего стека, где бы она ни была назначена.Обратите внимание, что это КОПИРОВАНИЕ назад.Будь то примитивный тип или указатель (который на самом деле является просто еще одним типом примитива).Ваш код может быть написан просто без использования указателей.Также обратите внимание, что ваш код вообще не использовал глобальную переменную, даже если вы упомянули глобальные переменные.

#include <math.h> 
#include <stdio.h> 

int sum(); 
int main() 
{ 
    int num; 
    num = sum(); 
    printf("\nSum of two given values = %d", num); 
    return 0; 
} 

int sum() 
{ 
    int a = 50, b = 80;
    int sum = 0; 
    printf("%d %d",a,b);
    sum = a+b; 
    return sum; 
} 

Имеет ли это смысл?

0 голосов
/ 15 мая 2019

Это должно работать

#include <math.h> 
#include <stdio.h> 

int *sum(); 
int main() 
{ 
    int *num; 
    num = sum(); 
    printf("\nSum of two given values = %d", *num); 
    free(num);
    return 0; 
} 

int *sum() 
{ 
    int a = 50, b = 80;
    int *sum = malloc(sizeof(int)); 
    printf("%d %d",a,b);
    *sum = a+b; 
    return sum; 
}

Вам необходимо выделить память для указателя. В вашем случае вам нужна память на одно целое число. Когда вы говорите int * sum = NULL, у вашего указателя нет адреса. Вы не можете получить доступ к нулевому указателю.

...