Как увеличить размер блока, на который указывает аргумент функции? - PullRequest
2 голосов
/ 26 февраля 2011
void foo(char *p)  
{  
    int i;
    int len = strlen(p);
    p = malloc(sizeof(char)*len+2);
    p[0] = '1';
    for(i=1; i<len+1; i++)
        p[i] = '0';
    p[i] = '\0';
}  

int main()  
{
    char p[2] = "1";

    foo(p);
    printf("%s\n", p);  // "10" expected

    return 0;
}

Я понял, что когда я вызываю malloc в foo, значение p было изменено, поэтому массив p в main не будет влиять.Но я не знаю, как это исправить.

Ответы [ 2 ]

2 голосов
/ 26 февраля 2011

У вас есть несколько ошибок в коде:

  • В main вы объявляете p как массив, который находится в стеке. Вещи, которые находятся в стеке, не могут быть позже изменены.

  • Затем в foo вы хотите изменить p, чтобы указывать на память из кучи, а не на объявленный вами массив.

То, чего вы хотите достичь, можно сделать, сначала выделив p с помощью malloc, а затем снова перераспределив эту память с помощью realloc:

void foo (char **p) {
  *p = realloc(*p, 4);
}

int main (void) {
  char *p = malloc(2);
  foo(&p);
  ...
}

Обратите внимание, что аргумент foo является двойным указателем. Это связано с тем, что realloc может не только изменять размер блока памяти, но и фактически перемещать его, что влияет на значение указателя.

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

2 голосов
/ 26 февраля 2011

Вам нужно передать адрес указателя и принять char** в качестве аргумента функции, т.е. передать &p в качестве аргумента и использовать *p внутри foo, чтобы получить адрес массива.Кстати, инициализация массива должна быть сделана char p[2] = {'1'};

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