Функция библиотеки Turbo C strcpy - PullRequest
0 голосов
/ 27 мая 2011

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

char buffer[10];
----------
strcpy(buffer, "Dante");

строка «Dante» будет помещена в буфер массива []. Строка будет содержать завершающий ноль ( \ 0 ), что означает, что будет скопировано всего шесть символов. Мне просто интересно , почему мы не можем добиться того же эффекта, просто сказав? :

buffer = "Dante";

Если я не ошибаюсь, C рассматривает строки гораздо больше как массивы, чем BASIC.

Ответы [ 6 ]

9 голосов
/ 27 мая 2011

Поскольку строки не являются типом данных в C. «Строки» имеют значение char* s, поэтому, когда вы пытаетесь назначить их, вы просто копируете адрес памяти, а не символы в буфер.

Учтите это:

char* buffer;

buffer = malloc(20);
buffer = "Dante";

Почему он волшебным образом помещает "Данте" в буфер?

3 голосов
/ 27 мая 2011

Адрес массива не подлежит изменению. В другом смысле вы можете считать,

char buffer[20];

- это время компиляции эквивалент,

char* const buffer = (char*)malloc(20);

Теперь, поскольку адрес buffer нельзя изменить, нельзя выполнять такие операции, как:

buffer = "Dante"; // error 'buffer' address is not modifiable
3 голосов
/ 27 мая 2011

Потому что «массив» в C - это кусок памяти.Нет указателя для присваивания.


Если вы спрашиваете, почему синтаксис не такой: ну, что будет, если длины будут другими?

2 голосов
/ 27 мая 2011
  • Если char buffer[128]; было объявлением, то buffer ссылается на первое местоположение массива, поэтому buffer = "Dante" попытается присвоить адрес строки дляадрес, который хранится в массиве.Адрес памяти в массиве только для чтения и назначается статически при компиляции.Таким образом, вы не можете сделать buffer = "Dante", поскольку он пытается изменить местоположение адреса, которое указывает на какое-то другое местоположение, зафиксированное во время компиляции.Эти местоположения не могут быть записаны.

  • Если char *buffer; было объявлением, тогда buffer является указателем на переменную типа char, которая может указывать на звездный блок блоков памяти,Поэтому, когда вы делаете buffer = "Dante" адрес строки в buffer.Когда будет показывать строку при печати, так как она указывает на начальный адрес строки, который компилируется и сохраняется в исполняемом файле.Но это не предпочтительный метод.

  • Если вы сделаете char arr[] = "Dante";, строка «Dante» будет сохранена в разделе .text, где вы можете написать, так что arr[0] = 'K' что-то вродеэто, т.е. возможно изменение.

  • Если вы сделаете char *arr = "Dante";, тогда строка «Dante» будет сохранена в .rodata или подобном месте, которое не доступно для записи.Это связано с тем, что строковые литералы не могут быть изменены в соответствии со стандартами.

2 голосов
/ 27 мая 2011

вы не можете сделать buffer = "Dante", потому что в Си нет типа "string", только массивы.

Теперь вы МОЖЕТЕ, однако, сделать ...

char buffer[10] = "Dante";

, ноесли длина строки неизвестна, вы можете сделать ...

char buffer[] = "Dante123456678";

, но только во время инициализации, то есть вы не можете сделать ...

char buffer[];

buffer = "Dante";
2 голосов
/ 27 мая 2011

Когда вы пишете buffer, он обрабатывается как указатель на первый элемент массива.Конечно, *buffer или buffer[0] - это первый элемент.Поскольку buffer является просто указателем, вы не можете назначить ему целый набор данных, например "Dante".

...