Передача структуры в вызов функции не работает - PullRequest
0 голосов
/ 13 апреля 2020

Поскольку C не поддерживает передачу по ссылке, и я разрабатываю что-то, что не может использовать кучу памяти, как я могу заставить эту работу работать? Я хочу, чтобы вызов функции set_var_name фактически изменял переменные global_log, а не только локальную копию. Спасибо

#include <stdio.h>
struct Record 
{ 
    char type[1];
    char var_name[1014];
    void* var_address;
    char is_out_dated[1];
}; 

struct Global_Log
{
    struct Record records[1024];
    int next_slot;
};

void set_var_name(struct Global_Log global_log, int next_slot, char* data, int size)
{
    for(int i = 0 ; i < size; i++)
        global_log.records[0].var_name[i] = data[i];
    printf("%s\n",global_log.records[0].var_name);//here prints out "hello"
}

int main()
{
    struct Global_Log global_log;
    char a[6] = "hello";
    set_var_name(global_log, 0, a, 6);
    printf("%s\n",global_log.records[0].var_name); // here prints out nothing
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

C - это язык вызова по значению - когда вы вызываете функцию, все аргументы передаются по значению (то есть копия делается в область действия вызываемого), а не по ссылке. Поэтому любые изменения аргументов в функции влияют только на копию в вызываемой функции.

Если вы хотите вызывать «по ссылке», вам нужно сделать это явно, передав указатель и разыменовав его в вызываемой функции. функция.

0 голосов
/ 13 апреля 2020

Кажется, вы работаете с копией экземпляра структуры, а не со ссылкой. Попробуйте передать указатель структуры в качестве параметра, чтобы вы могли работать со ссылкой на экземпляр:

void set_var_name(struct Global_Log* global_log, int next_slot, char* data, int size)

Другая альтернатива - использование глобальной переменной, поскольку, похоже, другого экземпляра не будет этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...