2017-02-11 4 views
1

Я хочу передать указатель на функцию и установить значение и передать его обратно. Вот моя попытка, но printf печатает мусор, где я ошибаюсь?Указатели массива C char

int a() { 
    char *p;  
    b(p);  
    printf("%s", p); 
    return 0; 
} 

int b(char * ptr) { 
    ptr = "test string"; 
    return 0; 
} 

ответ

3

Передайте ссылку на указатель.

int b(char **ptr) 
{ 
    *ptr = "Print statement"; 
    //your code 
} 
//call 
b(&p); 
+0

Я знаю, что это придирки, но я хотел бы изменить 'символ **' 'к сопзЬ гольца **', потому что постоянная строка. – d3L

+0

Я сам не очень разбираюсь в использовании указателя const, поэтому не могу этого предложить. – Pbd

+0

'' Операция печати '' является постоянной строкой и, скорее всего, будет помещена в раздел только для чтения исполняемого файла. Модификация приведет к сбою. 'const char *' '' предотвращает '' модификацию строки. – d3L

2

Если вы хотите установить значение указателя и передать его обратно, то b() должна возвращать указатель:

int a(void) { 
    char *p = NULL;  
    p = b(p);  
    printf("%s", p); 
    return 0; 
} 

char * b(char * ptr) { 
    ptr = "test string"; 
    return ptr; 
} 

Здесь p инициализируется NULL избежать неопределенного поведения с пропусканием неинициализированное значение для функции. Вы также можете инициализировать p в другой строковый литерал. Внутри b, ptr - копия указателя p, который был отправлен в b. Когда вы переназначаете значение, хранящееся в ptr, на адрес строкового литерала "test string", исходный указатель p не изменился. Пройдя ptr обратно к вызывающей функции и переназначив p на возвращаемое значение b, вызывающая функция может использовать обновленное значение.

Как @M.M указывает на комментарии, это несколько избыточно. Функция b() может вместо того, чтобы объявить указатель своего собственного, инициализируется строкового литерала:

int a(void) { 
    char *p = b();  
    printf("%s", p); 
    return 0; 
} 

char * b(void) { 
    char *ptr = "test string"; 
    return ptr; 
} 
+0

Вы хотели дать 'b' возвращаемый тип' char * '. Но в этом коде параметр функции является избыточным и должен быть удален. (На самом деле 'b (p)' вызывает неопределенное поведение, используя неинициализированное значение указателя). –

+1

@ M.M-- Спасибо за комментарий. Я думаю, теперь все исправлено. Я считаю, что C11 §6.3.2.1 2 о _lvalue conversion_ является соответствующим разделом для неопределенного поведения, которое вы описываете: «Если lvalue обозначает объект с автоматическим временем хранения ... и этот объект не инициализирован ..., поведение не определены «. Если есть еще одна цитата, которая лучше подходит для этой ситуации, просим ее передать. –