определение строкового значения для структурной переменной - PullRequest
2 голосов
/ 16 января 2011

Я просто проходил определенные вопросы для интервью. У меня есть проблема, связанная со структурой, я не понимаю, что происходит с выводом. Пожалуйста, если кто-то может объяснить причину.

Когда используется символьный указатель в структуре, такой как

#include <stdio.h>

struct name {
    char *array;
}variable;

int main( int argc, char * argv[] ){

    variable.array="hello";
    printf( "%s\n", variable.array );
}

Вывод выводится hello, но при изменении структурной переменной на

struct name {
    char array[10];
}variable;

Компилятор выдает ошибку «несовместимые типы в присваивании» на

variable.array="hello";

Я действительно смущен тем, где я упускаю суть. Почему это показывает ошибку как проблему назначения? Пожалуйста поправьте меня Спасибо

Ответы [ 4 ]

7 голосов
/ 16 января 2011

Вы можете инициализировать массив таким образом только во время объявления, иначе вам нужно использовать

strcpy(variable.array,"hello");

, вы даже не можете сделать это с простым массивом char

char a[10];

a="hello";

компилятор скажет:

incompatible types when assigning to type ‘char[10]’ from type ‘char *’

, потому что "hello" является строковым литералом, который удерживается указателем, который не может быть таким образом назначен массиву.

3 голосов
/ 16 января 2011

В C термин "hello" означает «указатель на строку, в которой есть символы 'hello\0'». Поэтому, когда вы назначаете array="hello" в первом случае, вы назначаете указатель на строку в переменную указателя. Что правильно.

Во втором случае вы пытаетесь назначить указатель на массив, что неправильно! Вы не можете присвоить значение массиву.

2 голосов
/ 16 января 2011

Возникает ошибка, потому что массив char и указатель на char это разные вещи.

Массив не является указателем.Указатель не является массивом.Иногда указатель может указывать на массив.Но даже когда указатель указывает на массив, это не массив.

Ваш компилятор дает адрес variable.array во время компиляции.Он также дает адрес строкового литерала "привет".Они не по одному адресу.Строковый литерал и массив (или «буфер») находятся в разных местах;логически, строка должна быть скопирована в буфер.

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

struct name {
    char array[10];
}variable;

int main( void ){

    strcpy(variable.array, "hello");
    printf( "%s\n", variable.array );
    return 0;

}

Вы можете найти FAQ по C полезным.

0 голосов
/ 19 февраля 2017

Во-первых, массив - это константный указатель на первый элемент в массиве
, мы не можем изменить его адрес, как только мы объявили .. подобно

int a[3]; is equivalent to int *const a;

so we cant change the array address location

int a[3]={1,2,3};

a++;//its an error

int b[3];

b=a;//its also an error

but int *c;

c=a;//Not an error because c is a pointer to integer not constant pointer to integer

similar to 
char str[10]="hello";

if i change like this

str="world";//its also an error

Pointers and arrays are always not equal, in some cases only like dereferencing 

   char a[10]="hello";
for(i=0;a[i]!='\0';i++)
   printf("%c",a[i]);

for(i=0;a[i]!='\0';i++)
   printf("%c",*(a+i));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...