не может правильно передать массив символов - PullRequest
0 голосов
/ 04 февраля 2012

Одна функция пытается передать массив символов другому, но безуспешно:

char * ret() {
    char buf[32];
    buf[0]='1'; // buf char array contains 1
    buf[31]='\0';
    printf(buf);
    return buf;
}

int multiline() {
    char temp[32];
    strcpy(temp,ret()); // temp array doesn't contain 1 after this line
    temp[31]='\0'; 
    printf(temp);
}

Скажите, пожалуйста, как решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 04 февраля 2012

вы возвращаете указатель на локальную переменную char buf[32];.Этот массив размещается в стеке и действителен только внутри функции, но не за ее пределами.Вы получаете неопределенное поведение при обращении к этому массиву.

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

1 голос
/ 04 февраля 2012

Вы можете решить проблему, не возвращая локальную переменную (выделите строку или верните указатель на статически распределенную переменную):

char * ret() {
    char * buf = malloc(32*sizeof(char));
    buf[0]='1'; // buf char array contains 1
    buf[31]='\0';
    printf(buf);
    return buf;
}

int multiline() {
    char temp[32];
    char * returnedString = ret();
    strcpy(temp,returnedString);
    free(returnedString);
    temp[31]='\0'; 
    printf(temp);
}
1 голос
/ 04 февраля 2012

Вы не можете вернуть указатель на локальную переменную; как только функция вернется, локальная переменная вместе с остальными кадрами стека функции будет уничтожена.

Вместо этого вы можете вернуть копию массива; Вы можете сделать один, используя strdup().

Кроме того, вы устанавливаете первый символ массива и ставите \ 0 в конце, но 30 символов между ними просто содержат мусор. Обычно \ 0 в конце строки находится сразу после допустимых символов, а не полностью в конце массива.

...