#c
Вопрос:
Когда я пытаюсь скомпилировать этот код, я получаю ошибки, говорящие error: format ‘%lu’ expects argument of type ‘long unsigned int *’, but argument 2 has type ‘uint64_t **’ {aka ‘long unsigned int **’}
и error: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘uint64_t *’ {aka ‘long unsigned int *’}
Итак, как я должен отформатировать testInteger, чтобы принять uint64?
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
uint64_t* testInteger = malloc(sizeof(uint64_t));
scanf("%lu", amp;testInteger);
printf("%lu", testInteger);
free(testInteger);
}
Комментарии:
1.
scanf("%lu", testInteger); printf("%lu", *testInteger);
2. Эппли, хорошо, что вы скомпилировали с включенным множеством предупреждений.
Ответ №1:
С uint64_t* testInteger = ... scanf("%lu", amp;testInteger);
, "%lu"
не соответствует а uint64_t**
, но а unsigned long *
.
как я должен отформатировать testInteger, чтобы принять uint64?
Чтобы прочитать a uint64_t
(не uint64), используйте "%" SCNu64
из <inttypes.h>
и uint64_t *
.
Чтобы написать a uint64_t
(не uint64), используйте "%" PRIu64
из <inttypes.h>
и uint64_t
.
#include <inttypes.h>
...
uint64_t* testInteger = malloc(sizeof *testInteger);
if (testInteger != NULL) {
if (scanf("%" SCNu64, testInteger) == 1) {//No amp; here,testInteger is a pointer
printf("%" PRIu64 "n", *testInteger); // Use a * here
}
}
Это хорошая идея, чтобы проверить на успех malloc()
и scanf()
.
Ответ №2:
Переменная testInteger
-это указатель. В первом случае экземпляр amp;testInteger
реализуется как указатель на указатель, поскольку на адрес указателя ссылается amp;
. Во втором случае указатель используется напрямую. Функция printf
ожидает целочисленное значение, а функция scanf
ожидает указатель, где %lu
используется. Для scanf
прямого использования testInteger
и для printf
использования *testInteger
, в котором будет использоваться сохраненное значение, а не сам указатель.
Ответ №3:
scanf в качестве аргумента получает указатель, так как testInteger уже является указателем, ваш amp;testInteger передаст указатель на указатель, и это недопустимо. Вы должны передавать testInteger только в scanf, а не в amp;testInteger. И в тестовом тегере печати следует разыменовать. Ваш код должен быть:
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
uint64_t* testInteger = malloc(sizeof(uint64_t));
scanf("%lu", testInteger);
printf("%lu", *testInteger);
free(testInteger);
}