Стандарт C не разрешает присваивать массив другому массиву:
char arr[] = "char_arr_one";
char arr2[] = {arr}; // This does not work.
Почему он работает в конкретной реализации c, как вы сказали, я не знаю, но в целом не должно быть возможности скомпилировать этот код без хотя бы одного предупреждения.
Так, может быть, вы отключили или даже проигнорировали предупреждения?
Здесь есть одна ссылка на этот контекст: Почему я всегда должен включать предупреждения компилятора?
Тем не менее это не даст вам желаемого результата копирования строки "char_arr_one"
в arr2
.
Если вы хотите сохранить строку, хранящуюся внутри arr
, в arr2
вы можете использовать strcpy
в заголовке string.h
:
char arr[] = "char_arr_one";
char arr2[13]; // You need to provide the amount of elements, at least
// as much as are required to store the string inside arr
// the null character.
strcpy(arr2,arr); // Copies the string in arr into arr2.
Обратите внимание, что вам нужно указать элементы arr2
, которые должны быть как минимум столько же, сколько требуется для хранения строки "char_arr_one"
плюс завершающий нулевой символ \0
при определении arr2
. В этом случае arr2
должно иметь как минимум 13 char
объектов.
Вы также можете «автоматически» определить размер arr
, используя оператор sizeof
:
char arr[] = "char_arr_one";
char arr2[sizeof(arr)]; // Automatically detects the size of `arr` and provides
// it for specify the required amount of elements for storing
// the string in arr + the null character.
strcpy(arr2,arr); // Copies the string in arr into arr2.
Кроме того, третий аргумент arr2[i+1]
внутри вызова printf
приведет вас к неопределенному поведению. На последней итерации будет напечатано что-то, что находится за пределами массива arr2
. Поэтому измените это на arr2[i]
.
Исправленный код должен быть:
#include <stdio.h>
#include <string.h>
int main(){
char arr[] = "char_arr_one";
char arr2[sizeof(arr)];
strcpy(arr2,arr);
printf("%s\n%s\n",arr,arr2);
for(int i = 0; i < 13; i++){
printf("%c %c\n", arr[i], arr2[i]);
}
return 0;
}
Выход:
char_arr_one
char_arr_one
c c
h h
a a
r r
_ _
a a
r r
r r
_ _
o o
n n
e e