2013-12-07 3 views
0

В приведенном ниже коде ptr печатает «привет мир», но temp пуст, хотя я прохожу temp в качестве адреса. Каковы могут быть возможные причины?указатель на символ не возвращает правильное значение

#include <stdio.h> 
#include <string.h> 
#include <malloc.h 
unsigned char temp[1024]; 

void func(unsigned char *ptr) 
{ 
    const char* x = "hello world"; 

    ptr = (unsigned char*) x; 

    printf("ptr=%s\n",ptr); 
} 

int main() 
{ 


    func(temp); 
    printf("temp=%s\n",temp); 

    return 0; 
} 

ответ

1

Это связано с параметром тени, проходящей используется в С.

На внутренней стороне func, вы изменяете локальную тень от температуры и делает его указывают на «привет мир» интернированная строка. Это не меняет исходный указатель temp в контексте main.

Для того, чтобы изменить temp вы должны передать указатель на temp в и настроить его:

#include <stdio.h> 
#include <stdlib.h> 

void func(unsigned char **ptr) 
{ 
    const char *x = "hello world"; 
    *ptr = (unsigned char*) x; 
} 

int main() 
{ 
    unsigned char *temp; 
    func(&temp); 
    printf("temp=%s\n",temp); 
    return 0; 
} 
+0

Термин _shadow параметр passing_ необычна терминология - конечно же, не стандартной терминологии. Но базовый диагноз правильный: вы передаете указатель по значению и изменяете локальную копию указателя в функции, не меняя указателя в вызывающем коде. Если вы хотите изменить указатель в функции, вам нужно передать адрес указателя, который будет изменен на функцию, так же, как если бы вы хотели изменить 'int', переданный функции, вы должны передать адрес «int» будет изменен на функцию. –

+0

@JonathanLeffler yep; параметр передается как тень (или копия). Я думаю, что обычная терминология может быть по-значению, что немного вводит в заблуждение, поскольку оно копирует значение и не меняет его. – amdixon

Смежные вопросы