В настоящее время я изучаю C для освоения университетского проекта. В этом проекте у нас есть несколько подписей, учитывая, что нам нужно внедрить для решения нашей задачи. После нескольких часов попыток добиться некоторого прогресса, я должен признать, что совершенно запутался в типах возвращаемых функций. Я покажу вам код:
Это структура, представленная для представления чисел в степени к основанию 32.
#include <stdio.h>
#include <stdlib.h>
typedef unsigned int uint32;
typedef struct
{
int n;
uint32* words;
}
foo;
Нам нужно реализовать некоторые функции, например, со следующей подписью:
foo add(foo* a, foo* b);
Как видите, функция принимает два указателя на структуру в качестве параметров и возвращает значение структуры, а не указатель на нее. Это означает, что мне нужно локально создать экземпляр foo и вернуть его.
foo add(foo* a, foo* b)
{
foo result = {1, malloc(sizeof(uint32))};
// do something with result
return result;
}
1) Что-то не так в этой попытке? В моем производственном коде у меня возникают проблемы с доступом к значению возвращаемой структуры: кажется, они изменились после того, как структура была возвращена. К сожалению, я не смог воспроизвести это поведение в более простом приложении, что еще больше беспокоило меня, что я все делаю неправильно. Я также пытался выделить память с помощью malloc для переменной результата, но, похоже, это работает, только если я создаю указатель на foo, что, похоже, не вариант, потому что я не могу вернуть указатель.
2)
Я ищу способ привести (возможно, не правильный термин) возвращаемый тип обратно в указатель.
Скажем так, у меня есть этот код:
foo* bar1 = malloc(sizeof(foo));
bar1->n = 1;
bar1->words = malloc(bar1->n * sizeof(uint32));
bar1->words[0] = 4294967295;
foo* bar2 = malloc(sizeof(foo));
bar2->n = 1;
bar2->words = malloc(bar2->n * sizeof(uint32));
bar2->words[0] = 21;
foo bar3 = add(bar1, bar2);
Работает нормально. Как я могу теперь использовать значение bar3 для повторного вызова функции добавления. Как это:
foo bar4 = add(bar1, bar3);
После того, как также попробовал различные попытки с созданием foo * и попыткой присвоить значения, но все они потерпели неудачу, и я решил опубликовать этот вопрос, чтобы получить хороший ответ, который поможет мне понять C немного больше.