Ошибка с кодом C при компиляции с ассемблерным кодом

В настоящее время я использую книгу, чтобы немного научиться сборке. Часть книги, в которой я работаю, посвящена malloc и бесплатности. Чтобы лучше понять это, в книге представлен ассемблерный код, создающий простую и бесплатную реализацию malloc, которая затем используется другой небольшой программой на языке C:

#include<stdio.h>

void *allocate(int);
void deallocate(void *);

int main() {

    char *a1 = allocate(500);
    char *a2 = allocate(1000);
    char *a3 = allocate(100);

    fprintf(stdout, "Allocations: %d, %d, %d\n", a1, a2, a3);

    deallocate(a1);

    char *a4 = allocate(1000);
    char *a5 = allocate(250);
    char *a6 = allocate(250);
    fprintf(stdout, "Allocations: %d, %d, %d, %d, %d, %d\n", a1, a2, a3, a4, a5, a6);

    fscanf(stdin, "%s", a5);
    fprintf(stdout, "%s\n", a5);

}

Я получаю ассемблерный код, но после их компиляции в терминале Linux с помощью:

gcc -static allocate.s usealloc.c -o usealloc

Я получаю несколько таких ошибок:

usealloc.c:12:40: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘char *’ [-Wformat=]
   12 |         fprintf(stdout, "Allocations: %d, %d, %d\n", a1, a2, a3);
      |                                       ~^             ~~
      |                                        |             |
      |                                        int           char *
      |                                       %s

Я предполагаю, что %d ожидает аргумент int, который противоречит объявлению a1, a2 и a3 char. Я еще не совсем знаком с C, но решил, что в опубликованной книге не будет такой простой проблемы, поэтому любая помощь приветствуется!

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

n. m. could be an AI 22.08.2024 14:28

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

Some programmer dude 22.08.2024 14:33

Re: «Я полагал, что в опубликованной книге не будет такой простой проблемы»: это неправильный расчет. Изданные книги имеют ошибки.

Eric Postpischil 22.08.2024 14:47

@n.m.couldbeanAI До этого момента с книгой все было в порядке. Это было легко понять. В любом случае, я считаю, это хороший урок.

roci_sevenPL 22.08.2024 14:56

@Someprogrammerdude Спасибо за совет. Согласен, глупо было бы изучать и то, и другое одновременно. Книга продается как пособие для начинающих. C будет моим следующим языком, который я выучу.

roci_sevenPL 22.08.2024 14:58

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

BoP 22.08.2024 15:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

fprintf(stdout, "Allocations: %d, %d, %d, %d, %d, %d\n", (int) a1, (int) a2, (int) a3, (int) a4, (int) a5, (int) a6);

А еще лучше вместо этого использовать %p, который используется для печати красиво отформатированных указателей, таких как 0x600000de0000:

fprintf(stdout, "Allocations: %p, %p, %p, %p, %p, %p\n", a1, a2, a3, a4, a5, a6);
%p указано, чтобы принимать аргумент типа void *, а не char *. Некоторые компиляторы предупреждают об этом. Таким образом, аргументы, которые будут напечатаны с %p, должны быть приведены к void *.
Eric Postpischil 22.08.2024 14:46

Приятно знать. Кланг не жаловался, но да, ОП может (void *) если нужно

Alexander 22.08.2024 14:56

Спасибо вам обоим! Это скомпилировано без ошибок после того, как я попробовал оба решения, но я буду иметь это в виду.

roci_sevenPL 22.08.2024 15:01

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