указатель на член структуры - PullRequest
0 голосов
/ 01 марта 2012
typedef struct
{   
    int A;
    int B;

    char* C; // problem is here
}foo;

int SetA(void)
{
    ....
    return retval;
}

int SetB(void)
{
    ....
    return retval;
}

const char* bar(void)
{
    .....
    char* retval="return val";
    .....
    return retval;
}

void SetFoo(foo* paramFoo)
{
paramFoo->A = SetA();
paramFoo->B = SetB();

paramFoo->C = bar();

}


static foo staticFoo;

void main()
{   
    SetFoo(&staticFoo);
    printf("%s",staticFoo.C);// printing
}

все пойдет хорошо, но "char * C" в struct foo будет написан плохо. Зачем? Мне нужно знать, если я сделал ошибку и как ее исправить? Я запустил бар (), и он возвращает правильное значение.

Спасибо Макс

Ответы [ 4 ]

3 голосов
/ 01 марта 2012

Я бы предпочел использовать malloc, а затем free, чтобы мне не пришлось беспокоиться о том, когда строковый литерал только для чтения будет уничтожен.

 const char* bar(void) 
 {     
     const char* retval="return val";
     char * value = malloc( strlen(retval) + 1 ); // +1 for the termination 
                                                  // character
     strcpy( value, retval );
     retrun value ;
 }

Не забудьте free вернуть значение, когда оно больше не нужно.

2 голосов
/ 01 марта 2012

Что-то не так с примером в том виде, в котором вы его сформулировали, потому что он действительно должен работать.

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

Я предполагаю, что ваш пример не является точным отражением вашего действительного кода теста.

0 голосов
/ 02 марта 2012

Я согласен с ответом Перри. Постоянная строка размещается в разделе данных только для чтения, а не в стеке. В foo () вы возвращаете постоянную строку, к ней можно безопасно обращаться из любого места.

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

   SetFoo(&staticfoo);
   printf("%s",staticFoo.C);

Вы видите, что оба объекта staticfoo и staticFoo не одинаковы. Если вы исправите это и запустите программу, вы должны напечатать строку. Это напечатано в моем случае.

0 голосов
/ 01 марта 2012

строка в функциональной панели является локальной переменной. вам нужно создать его malloc в буфере памяти или объявить его глобальной переменной

 char* bar(void) 
 {     
     char* retval=malloc(100*sizeof(char)); //malloc the buffer
     strcpy( retval,"return val");
     retrun retval ;
 }

или

char * str = "return val";
const char* bar(void)
{
    .....
    char* retval = str;
    .....
    return retval;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...