Уменьшать указатель, пока он не будет указывать на первый элемент массива - PullRequest
0 голосов
/ 05 мая 2018

Я использую *ptr, чтобы перебрать массив символов от конца к началу (один байт за раз) и установить некоторые значения в пути. Когда указатель указывает на первый адрес, алгоритм должен остановиться.

  char *buf = (char*)malloc(sizeof(char) * 3 + 1);
  char *ptr = &buf[sizeof buf - 1]; // *ptr point to the last address
  *ptr = '\0';

  do {
    if(alfa) {
      *(--ptr) = "teststring"[alfa]; // *ptr decreases value by one
      alfa -= i;
    } else { *(--ptr) = 'N'; }
  } while(*ptr != &buf[0]); // should check if *ptr is now pointing to the start of buf. If that's the case, stop.

Но, после того, как проверил, что адреса равны, он дает мне:

** stack smashing detected **: <unknown> terminated
Aborted (core dumped)

Другая (и, может быть, соответствующая) вещь: malloc должен выделять 4 байта из памяти, но когда я проверяю sizeof(buf), он имеет 8 байтов (?).

Примечание: вывод sizeof(char) * 3 + 1 действительно равен 4. Но это не то же самое, что sizeof(buf).

Ответы [ 2 ]

0 голосов
/ 23 июля 2018

Первый ответ правильный, но также и ваш последний тест:

while(*ptr != &buf[0]);

Не проверяет, что ptr не находится на первой позиции в буфере. Это было бы ptr != &buf[0] или просто ptr != buf.

Вы видите, не совпадают ли данные в указателе (*ptr) с местоположением начала буфера, тем самым сравнивая символ с указателем. Ваш компилятор, вероятно, дает вам предупреждение об этом. Не игнорируйте предупреждения в C.

0 голосов
/ 05 мая 2018

sizeof some_variable соответствует размеру переменной.

Таким образом, sizeof buf оценивается как размер buf. Если указатель buf является указателем, он дает 4 или 8 в зависимости от того, скомпилирован ли код на 32- или 64-разрядной платформе.

Чтобы исправить вашу проблему, измените это

  char *buf = (char*)malloc(sizeof(char) * 3 + 1);
  char *ptr = &buf[sizeof buf - 1]; 

к этому

  size_t size = sizeof(char) * 3 + 1;
  char *buf = malloc(size); /* No need to cast void-pointer sin C. */
  char *ptr = &buf[size - 1]; // *ptr point to the last address

Учитывая, что sizeof (char) равно 1 по определению, просто сделайте:

  size_t size = 3 + 1;
  char *buf = malloc(size); 
  char *ptr = &buf[size - 1]; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...