2017-01-27 1 views
0
#include <stdio.h> 

int main(void) { 
    int arr[10]; 
    arr = "Hello"; 
    printf("%s",arr); 
    return 0; 
} 

Приведенный выше код показывает ошибку компилятора:Почему я получаю сообщение: «Ошибка: присваивание выражения с типом массива»

t.c: In function ‘main’: 
t.c:5:9: error: assignment to expression with array type 
    arr = "Hello"; 
     ^
t.c:6:12: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=] 
    printf("%s",arr); 
      ^

В то время как ниже код работает отлично.

#include <stdio.h> 

int main(void) { 
    char arr[10] = "Hello"; 
    printf("%s",arr); 
    return 0; 
} 

Оба выглядят одинаково для меня. Что мне здесь не хватает?

+0

Int обр [10] = { 'H', 'е', 'л', 'л', 'о', 0, 0, 0, 0, 0}; – clearlight

+0

char * arr = "Hello"; – clearlight

+0

char arr [] = "Hello"; – clearlight

ответ

4

Это не одинаково.

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

Затем, исправляя тип данных, учитывая char массив используется,

  • В первом случае,

    arr = "Hello"; 
    

    является assignment, который не допускается с тип массива как LHS присвоения.

  • Ото,

    char arr[10] = "Hello"; 
    

    является initialization заявление, которое вполне допустимо утверждение.

+0

Мой компилятор дает ошибку (для формы инициализации): z.c: 2: 8: ошибка: инициализация массива с широким символом с нешироким строковым литералом int x [10] = "foo"; – clearlight

+1

Инициализация не является «вполне допустимой», потому что массив символов не может быть инициализатором для int, это нарушение ограничения. –

+0

Итак, это неправдоподобно. Это мысль, которая рассчитывает. Было бы справедливо, если бы это был массив символов! – clearlight

0

Не знаю, как работает ваш второй код (он не работает в моем случае ПОЖАЛУЙСТА СКАЖИТЕ МНЕ, ЧТО МОЖЕТ БЫТЬ ПРИЧИНУ) он говорит: array of inappropriate type (int) initialized with string constant

Поскольку вы не можете просто назначить целое string - integer переменная. , но вы можете назначить одну character к int переменной как: int a[5]={'a','b','c','d','d'}

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