Установить указатель аргумента, чтобы он указывал на новую память внутри функции (не возвращая ее) IN C - PullRequest
1 голос
/ 20 апреля 2010

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

Я хочу написать функцию, которая будет возвращать одну вещь, и изменить предоставленный указатель на другую.

Мое текущее объявление функции. , .

char * replaceURLS(char * body)

Что я хочу сделать, это скопировать все данные тела в новую строку и установить тело, чтобы указать на эти новые данные. Затем я хочу, чтобы afterURL указывал на местоположение в новой строке.

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

Заранее спасибо! Rob

Ответы [ 7 ]

2 голосов
/ 20 апреля 2010
char * replaceURLS(char ** body)
{
    char *newString = (char *) malloc(strlen(*body) + 1);
    strcpy(newstring, *body);

    *body = newString;

    return(newString + whateverOffsetWithinTheStringYouNeedToReturn);
}
1 голос
/ 20 апреля 2010

Вам нужно будет передать указатель на указатель:

char * replaceURLS(char ** body_ptr) {
    char * newString;
    // copy data and replace URLS in newString
    *body_ptr = newString;
}

replaceURLS(&body);

(Какой символьный указатель вы возвращаете? Предположительно, не newString, или вы можете просто сделать body = replaceURLS (body).)

1 голос
/ 20 апреля 2010
char * afterURL replaceURLS(char ** body)
1 голос
/ 20 апреля 2010

вам нужно: в C ++

char * afterURLreplaceURLS(char *& body);

в С

char * afterURLreplaceURLS(char ** body);

then call with:

replaceURLS(&pointer)
0 голосов
/ 20 апреля 2010

Здесь вам нужен указатель на указатель.

Вызовы функций по значению.Когда вы передаете указатель, вы передаете значение, представляющее ячейку памяти.Затем функция может изменить то, что хранится в этом месте в памяти.

Если вы хотите изменить то, на что указывает указатель, вы должны передать указатель на этот указатель :) Код, приведенный ниже, на самом деле неполезно, но должно продемонстрировать.

void changeMyString(char **myString)
{
  free(*myString);  
  *myString = (char*)malloc(20); /* Just as example, 20 bytes */
  sprintf(*myString,"This is new");
}    
0 голосов
/ 20 апреля 2010

Вы передаете адрес по значению.

char * replaceURLS(char * body)

должен быть семантически заменен, как на самом деле

char * replaceURLS(char * addressOfStartOfBody)

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

char * replaceURLS(char ** addressOfBodyAddress)

Тогда, чтобы позвонить, у вас будет примерно такой код

char * bodyAddress;
char * returnVal = replaceURLS(&bodyAddress);

Это передаст адрес переменной bodyAddress. Это означает, что вы сможете изменить то, на что указывает bodyAddress.

0 голосов
/ 20 апреля 2010

Если вы в настоящий момент измените значение body, фактический указатель не изменится, только ваша копия. Вместо этого вам нужно передать указатель на указатель , как показано ниже:

void replaceURLS(char ** body){
    *body = "The new string.";
}

Тогда, когда вы используете функцию, сделайте это так:

char* randomString = "Old string"; //Containing your old string
replaceURLS(&randomString);

Это должно сделать это.

...