предупреждение: return делает указатель из integer без приведения, но возвращает integer по желанию

Я пытаюсь найти правильный способ вернуть целое число из вызова функции void * в C.

ie ..

#include <stdio.h>

void *myfunction() {
 int x = 5;
 return x;
}

int main() {
  printf("%dn", myfunction());
  return 0;
}

но я продолжаю получать:

предупреждение: return делает указатель из целого числа без приведения

есть ли бросок, который мне нужно сделать, чтобы сделать эту работу? Кажется, что он возвращает x без проблем, реальная myfunction возвращает указатели на структуры и символьные строки, а также которые все работают, как ожидалось.

4 ответов


не очевидно, что вы пытаетесь выполнить здесь, но я предположу, что вы пытаетесь сделать некоторую арифметику указателя с x и хотели бы, чтобы x было целым числом для этой арифметики, но указателем пустоты при возврате. Не вдаваясь в то, почему это имеет или не имеет смысла, вы можете устранить предупреждение, явно приведя x к указателю void.

void *myfunction() {
 int x = 5;
 return (void *)x;
}

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

void *myfunction() {
 long x = 5;
 return (void *)x;
}

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

void * myfunction() {
  int * x = malloc(sizeof(int));
  *x=5;
  return x;
}

это, как говорится, вам не нужно возвращать void * для int, вы должны вернуть int * или даже лучше просто int


хотя можно подумать, что самый простой способ сделать это:

void *myfunction() {
  int x = 5;
  return &x; // wrong
}

это фактически неопределенное поведение, так как x выделяется в стеке, а кадр стека "сворачивается", когда функция возвращается. Глупый, но правильный способ:

void *myfunction() {
  int *x = malloc(sizeof(int));
  *x = 5;
  return x;
}

пожалуйста, никогда, никогда не пишите такой код.


я скомпилировал этот источник с gcc -pedantic:

 #include <stdio.h>

 void *myfunction() {
   size_t x = 5;  
   return (void*)x;
 }

 int main() {
   printf("%d\n", *(int*)myfunction());
   return 0;
 }

нет никаких предупреждений