Простой код C с досадной ошибкой «несовместимые типы при присваивании»

StackOverflow https://stackoverflow.com/questions/533724

Вопрос

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

Мой компилятор продолжает говорить мне:"ошибка несовместимых типов в присваивании"

На линии с перераспределить функция

Что я делаю не так?Мне кажется, что и «обратный», и результат перераспределить должны быть указатели на тип char?

Мой код:

int main(){
char  first[]="hello mark", strng='h', reverse[]="";
char* ptr=&first[10];
int i=0;
    while(ptr > (&strng-0xf4240)){
        printf("%c", *ptr--);
        reverse = realloc(reverse, (i++ * sizeof(char)));
        reverse[strlen(reverse)-i] = *ptr;
    }
printf("%s", reverse);
return 0;
}

Спасибо!

РЕДАКТИРОВАТЬ:Извините, я неправильно разместил это в комментариях ниже.

Спасибо за помощь, первый и второй комментарий понял!У меня были необходимые #includes, я просто забыл скопировать их в переполнение стека.Вы были правы, теперь я застрял на strlen() с ненулевым завершением.Я решу этот вопрос самостоятельно.Еще раз спасибо!

Я поторопился, скомпилировалось нормально, но есть логическая ошибка.Цикл while выполняется один раз.Однако последующие циклы по-прежнему завершаются неудачно, независимо от начального значения i.Строка, вызывающая сбой, — это строка, вызывающая realloc.

Это было полезно?

Решение

Вы не можете перераспределить память, которая изначально не была выделена.Вам следует объявить реверс как «char *» и для начала высвободить его.

Это поможет вам приступить к работе, но вам действительно следует подумать о перераспределении по частям, а не по одному байту за раз.О, я не удосужился исправить тот факт, что «reverse», вероятно, не завершается нулем, когда вы пробуете strlen — я оставлю это в качестве упражнения для читателя.

int main(){
char  first[]="hello mark", strng='h';
char* reverse;
char* ptr=&first[10];
reverse = (char*)malloc(1);
reverse[0] = '\0';
int i=0;
    while(ptr > (&strng-0xf4240)){
        printf("%c", *ptr--);
        reverse = (char*)realloc(reverse, (i++ * sizeof(char)));
        reverse[strlen(reverse)-i] = *ptr;
    }
printf("%s", reverse);
return 0;
}

Другие советы

Или:

  • Вы компилируете свой C -код с компилятором C ++.Вот почему он думает, что вам нужно бросить пустоту* возвращенным realloc к символу*.Конверсия будет законным в C.

или

  • Вам не удалось включить stdlib.h, так считает компилятор realloc возвращает int

Редактировать

При повторном чтении вашего кода реальная проблема заключается в том, что вы назначаете массив, которому не разрешено появляться в левой части присваивания (это не «lvalue»).Хорошо, что вы приняли другой ответ.Там есть несколько хороших советов.

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

Да, определенно верно, поскольку для перераспределения у malloc должна быть некоторая дополнительная информация об участке памяти, которым вы манипулируете (либо через таблицу распределения блоков, либо сохраненную в 4 байтах непосредственно перед вашим указателем).Но вы все равно можете написать:

char * ptr1 = malloc(16);
char * ptr2 = ptr1 + 8;
ptr2 = realloc(ptr2,32);

И у вас не будет ошибки компилятора.Однако вы все равно, вероятно, получите ошибку сегмента во время выполнения.

Однако существует фундаментальное различие в том, как компилятор C обрабатывает

char * tab = "toto";

и

char tab[] = "toto";

В первом случае вкладка является указателем типа char * и является lvalue, как и любая обычная переменная.Вероятно, большую часть времени он находится в регистре или может быть адресом в куче.Во втором случае tab представляет собой массив, константу и, следовательно, не является lvalue.Вероятно, на уровне сборки он заменяется адресом, указывающим на текстовый раздел вашего двоичного исполняемого файла, где находятся данные для строки «toto».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top