C-программа падает после strcpy - PullRequest
1 голос
/ 03 апреля 2012

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

char variable1[8];

И затем я пытаюсь скопировать возвращаемое значение функции, т.е.

...
strcpy(variable1, (char *)function1());

Где function1 () возвращает charзначение массиваВот структура function1:

 char* function1()
{
    ....
    char variable2[8]={'\0'};
    ...
    return (variable2);
}

Программа падает, когда я пытаюсь выполнить строку strcpy.

Я прочитал о функции strcpy здесь , что

Важное замечание: Вы должны убедиться, что целевой буфер (s1) может содержать все символы в исходном массиве, включая завершающий нулевой байт.В противном случае strcpy () перезапишет память за концом буфера, что приведет к переполнению буфера, что может привести к сбою программы

Поэтому я попытался увеличить размер variable1 до 20, но программа все равносбои.

Помимо этого, я попробовал другой подход, то есть использовать вызов функции strncpy, и он все еще дает мне ту же ошибку.

Странно то, что я мог выполнить функцию1 (), котораявозвращает значение без проблем.Только когда я попытался скопировать его, моя программа падает.Есть идеи, что мне делать дальше?

Ответы [ 2 ]

10 голосов
/ 03 апреля 2012

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

В function1 в стеке создается variable2, но это эффективно уничтожается при выходе из функции. Попытка использовать его впоследствии (например, в операции strcpy) - неопределенное поведение.

Если вам нужен массив, который будет работать после выхода из функции, вы, вероятно, захотите выделить его из кучи:

char *function1 (void) {
    return calloc (1, 8);    // allocate and zero out 8 bytes
}

и не забудьте впоследствии освободить указатель.

1 голос
/ 03 апреля 2012

Проблема в том, что значение char не является char*, и приведение не делает его таким (просто компилятор перестает жаловаться).Таким образом, программа падает, потому что она пытается разыменовать недопустимый указатель.

Попробуйте:

variable[0] = function1();  // store the returned character
variable[1] = 0;            // make sure there's a terminating null char
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...