Формат, указанный для uint64_t, выдает ошибку

#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);
}