当函数需要指针时传递一个常量整数

时间:2011-05-24 21:15:40

标签: c pointers casting

将一个常量整数值传递给需要指针的函数的最佳/最佳的方法是什么?

例如,write函数

write (int filedes, const void *buffer, size_t size);

假设我只想写一个字节(1),我想这个:

write (fd, 1, 1);

但我明显得到警告

warning: passing argument 2 of 'write' makes pointer from integer without a cast

我知道我能做到

int i = 1;
write (fd, &i, 1);

但这是必要的吗?在不需要声明/初始化新变量的情况下,最正确的方法是什么?

7 个答案:

答案 0 :(得分:10)

在C89 / 90中,如果不声明新变量,通常无法执行此操作。关于C中指针的事情是它们总是指向左值。左值是在记忆中有位置的东西。因此,为了向函数提供正确的参数,您需要在内存中具有位置的东西。这通常需要一个定义,即一个对象,一个变量。 C中的常量不是左值,因此您不能在那里使用常量。常量和变量之间的某些东西是文字。 C89 / 90只有一种文字:字符串文字。字符串文字是左值,但不是变量。因此,您可以使用字符串文字作为write的第二个参数。

在C99中,文字的概念扩展到字符串文字之外。在C99中,您还可以使用复合文字来实现此目的,这也恰好是左值。在您的示例中,您可以将您的功能称为

write(fd, (char[]) { 1 }, 1)

但此功能仅适用于C99。

答案 1 :(得分:3)

是的,这是必要的。在C语言中没有其他方法可以做到这一点同样清楚,因为你不能把/得到一个指针指向临时的地址。

(而且,正如@rob已经说过的那样,你应该取char的地址。你的例子是不可携带的。)

编辑:请参阅@ AndreyT的答案并将编译器设置为C99模式。

答案 2 :(得分:3)

对于您引用的具体案例,您可以这样做:

write(fd, "\001", 1);

但是,更一般地说,你必须这样做,你正在抱怨。您必须在获取对象之前声明对象:

 SomeType i;
 SomeFUnction(&i);

答案 3 :(得分:1)

整数不是指针。如果你传递一个,它将取消引用虚拟地址1并死掉。您必须创建该变量并传递其地址。

答案 4 :(得分:1)

写入需要一个地址作为第二个参数 - 与它一起使用。

答案 5 :(得分:0)

您可以使用drprintf()打印到文件描述符。它类似于打印到fprintf()的{​​{1}}。

FILE *

有关详细信息,请参阅int dprintf(int fd, const char *format, ...);

函数dprintf()和vdprintf()(在glibc2库中找到)是fprintf(3)和vfprintf(3)的精确模拟,除了它们输出到文件描述符fd而不是a stdio stream。

符合POSIX.1标准,不是通用的。

答案 6 :(得分:0)

write(var, new int(4))

这似乎有效。不知道这有多好,因为我没有那么多使用c ++。 如果这是一个不好的方法,请告诉我。