предупреждение: 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;
}
нет никаких предупреждений