2013-07-11 3 views
1

Предположим, что мне так нравится копировать строку.Можно ли скопировать строку в пустой строке?

char str[] = ""; 
char *str2 = "abc"; 
strcpy(str, str2); 
printf("%s", str); // "abc" 
printf("%d", strlen(str)); // 3 

Тогда почему это не дает мне неопределенного поведения или приводит к сбою программы. Каковы недостатки такого?

+6

Как вы знаете, что это не дает вам неопределенного поведения? –

+0

, потому что это дает мне правильную длину строки. –

+1

[Неопределенное поведение означает * что-либо * может случиться] (http://blogs.msdn.com/b/oldnewthing/archive/2011/09/29/10217910.aspx) – phihag

ответ

3

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

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
     char str[] = ""; 
     char *str2 = "A really, really, really, really, really, really loooooooooooooooonnnnnnnnnnnnnnnnng string."; 
     strcpy(str, str2); 
     printf("%s\n", str); 
     printf("%d\n", strlen(str)); 
     return 0; 
} 

надуманный пример, да, но результат работы это:

A really, really, really, really, really, really loooooooooooooooonnnnnnnnnnnnnnnnng string. 
92 
Segmentation fault 

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

4

Вы записываете пространство памяти, выделенное str в стеке. Вы должны убедиться, что у вас есть достаточное пространство для str. В этом примере вы говорили, что вам нужно пространство для A, B, и C плюс нулевой символ конца строки, так что этот код должен работать:

char str[4]; 
char *str2 = "abc"; 
strcpy(str, str2); 
printf("%s", str); // "abc" 
printf("%d", strlen(str)); // 3 
2

Это фактически дает неопределенное поведение, но ваша программа Безразлично» из-за этого. Вот как работает неопределенное поведение.

Смежные вопросы