2012-04-03 2 views
1

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

char variable1[8]; 

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

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

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

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

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

Я прочитал на функции STRCPY here что

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

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

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

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

+0

Узнайте, как использовать отладчик. И спросите у компилятора все предупреждения, которые он может вам дать (например, 'gcc -Wall -Wextra'), затем улучшите исходный код, пока не будут указаны предупреждения. –

ответ

10

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

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

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

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

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

+0

Я понимаю, что вы здесь пытаетесь сказать, но содержимое самой функции1 добавляет нулевой терминатор. Пожалуйста, обратитесь к отредактированному вопросу выше, где я добавил содержимое функции1(). Итак, что может быть проблемой? –

+1

@ vampirus87: вы значительно изменили вопрос из исходной версии, поэтому я обновил ответ для вас. – paxdiablo

+0

Правильно, да, я понял, что добавление содержимого функции1 имеет огромное влияние, поэтому. Другими словами, вы говорите, что переменная выходит за пределы области действия. Но вот здесь 'strcpy (variable1, (char *) function1());' Я использую вызов функции1() правильно, технически он все равно должен работать правильно? –

1

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

Try:

variable[0] = function1(); // store the returned character 
variable[1] = 0;   // make sure there's a terminating null char 
Смежные вопросы