Указатель на элемент структуры, который является ссылкой на переменную - PullRequest
1 голос
/ 04 февраля 2012

Рассмотрим:

struct
{
  char *rcssMonitoredServices;
  int  nSomeVar;
} appinfo;

При обычном использовании:

appinfo.rcssMonitoredServices=strdup("something");

Однако теперь рассмотрим:

char *RefToStructVar[]=
{
  appinfo.rcssMonitoredServices,
  "\0"
};

Намерение состоит в том, что мы можем выполнять операции с appinfo.rcssMonitoredServices, используя указатель RegToStructVar [0].

Есть веские причины, по которым у меня есть переменные, указанные в массивах. В случае целочисленных переменных, мы в порядке. Указатели на * char совершенно разные.

Если я делаю ту же технику против appinfo.nSomeVar

int *varpointers[] =
{
    &appinfo.nSomeVar,
    0
};

varpointers[0]=196;
printf("%i",appinfo.nSomeVar) // -> "196"

Я думал, что, учитывая, что RefToStructVar [0] содержит указатель на appinfo.rcssMonitoredServices, делая вещи вроде

RefToStructVar[0]=strdup("something");

Будет идентично:

appinfo.rcssMonitoredServices=strdup("something");

Но нет.

Это

RefToStructVar[0]=strdup("something");

ошибку сегментации.

Возможно, основной ... но сейчас я запутался.

-

позже

Вот что такое segfaults:

    struct 
    {
        char *cVar;
        int n;
    } mystruct;

    char *aVars[]=
    {
        mystruct.cVar,
        "\0"
    };

    aVars[0]=strdup("something");

Это работает:

    struct 
    {
        char *cVar;
        int n;
    } mystruct;

    char **aVars[]=
    {
        &mystruct.cVar,
        "\0"
    };

    *aVars[0]=strdup("something");

1 Ответ

2 голосов
/ 04 февраля 2012
RefToStructVar[0]=strdup("something");

не идентичен

appinfo.rcssMonitoredServices=strdup("something");

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

Кроме того, нет абсолютно никаких причин, по которым RefToStructVar[0] = anything должен вызывать segfault, если RefToStructVar не является массивом, но недопустимым указателем или чем-то еще.Я думаю, что вы неправильно диагностируете сайт аварии.

Вы говорите:

Намерение состоит в том, что мы можем выполнять операции с appinfo.rcssMonitoredServices, используя указатель RegToStructVar [0].

Однако это не то, что он делает.Это просто копирование указателя из appinfo в массив.Вы можете выполнять операции со строкой, такие как изменение символа таким образом, но если вы назначаете любой из них, они становятся независимыми.Вам нужен указатель на указатель, если вы хотите сделать это:

char** RegToStructVar[] = {
    &appinfo.rcssMonitoredServices
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...