Разница между массивом символов и указателем - PullRequest
8 голосов
/ 07 января 2012

Я делаю одно и то же в обоих кодах.

В коде 1: я использовал char * и выделил место с помощью malloc в main.

В коде 2: я использовал массив char для той же цели. Но почему выход отличается?

Код 1:

struct node2
{
    int data;
    char p[10];
}a,b;

main()
{
    a.data = 1;

    strcpy(a.p,"stack");
    b = a;
    printf("%d %s\n",b.data,b.p);     // output 1 stack
    strcpy(b.p,"overflow"); 
    printf("%d %s\n",b.data,b.p);     // output  1 overflow
    printf("%d %s\n",a.data,a.p);     // output  1 stack
}

Код 2:

struct node1
{
    int data;
    char *p;
}a,b;

main()
{
    a.data = 1;
    a.p = malloc(100);
    strcpy(a.p,"stack");
    b = a;
    printf("%d %s\n",b.data,b.p);   //output 1 stack
    strcpy(b.p,"overflow");  
    printf("%d %s\n",b.data,b.p);   // output 1 overflow
    printf("%d  %s\n",a.data,a.p); // output 1 overflow(why not same as previous one?)  
}

Ответы [ 3 ]

10 голосов
/ 07 января 2012

Во втором примере вы присваиваете a для b, что означает, что a.p (char*) присваивается b.p. Поэтому изменение памяти, на которую указывает b.p, также изменяет память, на которую указывает a.p, поскольку они оба указывают на одно и то же место в памяти .

В первом примере у вас есть два отдельных массива . Присвоение a b копий каждого char в массиве a.p b.p - эти блоки памяти являются частью struct, они не являются указателями на определенный часть в памяти. Любое изменение b.p в этом случае не может повлиять на a.p, поскольку они совершенно не связаны.

3 голосов
/ 07 января 2012

В вашем первом коде структура содержит фактический массив символов (char[10]), поэтому при копировании структуры (b = a) массив также копируется.Затем вы перезаписываете один из них, но не другой.

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

3 голосов
/ 07 января 2012

Символьные указатели и символьные массивы - это не одно и то же.

Ваш узел с массивом копируется, поэтому содержимое копируется в новый узел.Когда вы помещаете новое значение (переполнение) в скопированный узел (b), он перезаписывает только копию.

Ваш узел с указателем символов получает скопированное значение указателя, поэтому оба узла указывают на одну и ту же памятьместо нахождения.Когда вы помещаете новое значение (переполнение) в скопированный узел (b), он записывает в память, на которую оба узла имеют указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...