С выделенными указателями?Что это? - PullRequest
8 голосов
/ 01 декабря 2011

У меня есть следующий код.

char a[] = "abcde";
char *b = "fghij";
char *c = malloc(6);
char *d = c;
c = "klmno";

И упражнение гласит:

Нарисуйте структуру данных a, b, c и d (с содержанием), где вы можете увидеть, что было выделено, и использовать стрелки, чтобы показать, как установлены указатели.

Мое решение:

      ____________
a -> |a|b|c|d|e|\0|
      ¨¨¨¨¨¨¨¨¨¨¨¨
      ____________
b -> |f|g|h|i|j|\0|
      ¨¨¨¨¨¨¨¨¨¨¨¨
      ____________
c -> |k|l|m|n|o|\0|
      ¨¨¨¨¨¨¨¨¨¨¨¨
      ___________
d -> | | | | | | |
      ¨¨¨¨¨¨¨¨¨¨¨

Однако мое решение не было принято, иОтвет был " выделенная память для указателя на b, c, d, но не ".Может кто-нибудь объяснить мне, что это значит?

Ответы [ 5 ]

9 голосов
/ 01 декабря 2011

Это немного загадочный ответ, но я предполагаю, что жалоба состоит в том, что массив a не указывает на эти данные; содержит данных.

Так что это может быть тем, что требуется (без стрелки-указателя):

    ____________
a  |a|b|c|d|e|\0|
    ¨¨¨¨¨¨¨¨¨¨¨¨

Имя массива можно использовать в качестве указателя, но оно по-прежнему имеет немного другое значение.

7 голосов
/ 01 декабря 2011

Я бы нарисовал их так:

      ____________
     |a|b|c|d|e|\0|
      ¨¨¨¨¨¨¨¨¨¨¨¨
           a
      ____________
b -> |f|g|h|i|j|\0|
      ¨¨¨¨¨¨¨¨¨¨¨¨
      ____________
c -> |k|l|m|n|o|\0|
      ¨¨¨¨¨¨¨¨¨¨¨¨
      _____________
d -> |g|a|r|b|a|g|e|
      ¨¨¨¨¨¨¨¨¨¨¨¨¨

Обратите внимание, что a находится ниже всего массива, а не рядом со стрелкой.Следует подчеркнуть, что a - это целый массив, содержащий саму строку, а не только указатель.Это показывает, что вы понимаете разницу между массивом и указателем .

1 голос
/ 01 декабря 2011

Я думаю, что вы в значительной степени правы:

    char a[] = "abcde";
    printf("a[]: [%s] length:%d\n", a, strlen(a));

    char* b = "fghij";
    printf("*b: [%s] length:%d\n", b, strlen(b));

    char* c = (char*)malloc(6);
    char* d = c;

    c = "klmno";
    printf("*d = c: d is [%s] length:%d\n", d, strlen(d));
    printf("*d = c: c is [%s] length:%d\n", c, strlen(c));

Выходы:

a[]: [abcde] length:5
*b: [fghij] length:5
*d = c: d is [] length:0
*d = c: c is [klmno] length:5

Примечание: Даже если strlen()ищет символ NULL, чтобы иметь возможность перебирать массив строк и считать символы, вхождение NULL само по себе не добавляется к окончательной сумме, поэтому оно сообщает о 5 символах вместо 6.

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

1 голос
/ 01 декабря 2011

Я бы даже попытался различить, где данные указывают на жизнь.

  ____________
a|a|b|c|d|e|\0| (in data segment or on stack)
  ¨¨¨¨¨¨¨¨¨¨¨¨
  _____      ____________
b|ptr->| -> |f|g|h|i|j|\0| (in rodata)
  ¨¨¨¨¨      ¨¨¨¨¨¨¨¨¨¨¨¨
  _____      ____________
c|ptr->| -> |k|l|m|n|o|\0| (in rodata)
  ¨¨¨¨¨      ¨¨¨¨¨¨¨¨¨¨¨¨
  _____      ___________
d|ptr->| -> |X|X|X|X|X|X| (on heap)
  ¨¨¨¨¨      ¨¨¨¨¨¨¨¨¨¨¨
1 голос
/ 01 декабря 2011

Содержимое памяти, указываемое d, фактически не определяется.Он должен содержать мусор, который приходит с malloc() на c

...