C指针void *缓冲区问题

时间:2011-09-14 17:06:30

标签: c pointers system-calls

很抱歉用C语言搞乱你们。 write()采用void * buff。我需要通过提供所需的数据从main()调用此函数。

但是当我打印它时会抛出错误。帮帮我朋友。 代码如下。

void write(int fd, void *buff,int no_of_pages)
{
  // some code that writes buff into a file using system calls
}

现在我需要使用我需要的数据发送buff。

#include "stdio.h"
#include "malloc.h"
int main()
{
int *x=(int*)malloc(1024);
*(x+2)=3192;

*(x+3)="sindhu";

     printf("\n%d %s",*(x+2),*(x+3));      

     write(2,x,10); //(10=4bytes for int + 6 bytes for char "sindhu");
}

警告我

warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘int’

如何删除此警告

5 个答案:

答案 0 :(得分:5)

通过强制转换为有效类型:

printf("\n%d %s",*(x+2),(char*)(x+3)); 

注意:你所做的事情看起来很邪恶。我会重新考虑这个设计!

答案 1 :(得分:2)

非常简单:按照错误说的那样做。不要将整数传递给字符串格式化序列。

printf("\n%d %d", *(x+2), *(x+3));
              ^--- note the change

答案 2 :(得分:1)

您需要使用char *来引用字符串:

char * cp = "sindhu";
printf("\n%d %s", *(x+2), cp);

会更好。

答案 3 :(得分:0)

你的问题实际上有几点有趣。首先,我很惊讶printf生成的警告对您的编译器非常有帮助,因为printf本身不是类型安全的,因此不需要警告。其次,我真的很惊讶你的编译器允许这样做:

*(x+3) = "sindhu";

我很确定这应该是一个错误,或者至少是一个警告,没有明确的演员。请注意,"sindhu"的类型为const char*,而您的数组是int类型的数组。基本上你在这里做的是将字符串的内存地址放入数组中的第4个整数。现在重要的是,这是一个非常危险的假设:

sizeof(int) == sizeof(char*)

情况可能并非如此;最值得注意的是,许多64位系统都没有这种特性。

Bitmask的answer将消除您收到的警告,但正如他所建议的那样,我强烈建议您更改程序的设计,以便不需要这样做。

同样作为一个最后的风格点记住,大多数情况下C中的数组和指针是相同的,这不完全正确,但足以说*(x+2)相当于x[2]这是相当的阅读代码时,眼睛更容易。

答案 4 :(得分:0)

int *x=(int*)malloc(1024);

失去演员;没有必要,如果您忘记#include stdlib.h或者在范围内没有malloc的演员表,它将会抑制有用的诊断。其次,从可读性的角度来看,通常更好地指定特定类型所需的元素的数量,而不是多个字节。你这样做是这样的:

int *x = malloc(N * sizeof *x);

表示“分配足够的内存来存储N int值”。

*(x+2)=3192;

好。您要将整数值3192指定给x[2]

*(x+3)="sindhu";

Bad juju;我很惊讶编译器没有在这条线上牦牛。您正尝试将char *类型的值存储到int(因为x的类型为int **(x + 3)的类型为{ {1}})。我不确定你在这里想要完成什么;如果您尝试将指针的值存储在int,请注意指针值可能不一定可以表示为x[3](例如,假设int为4个字节宽但char *宽2个字节)。在任何一种情况下,类型都不兼容,并且需要强制转换:

int

如果您尝试将字符串的内容复制到从*(x + 3) = (int) "sindhu"; // equivalent to writing x[3] = (int) "sindhu" 开始的缓冲区,那么肯定是错误的方法;为了使这个“工作”(对于“工作”的适当宽松的定义),你需要使用x[3]strcpy库函数:

memcpy

对于strcpy((char *) (x + 3), "sindhu"); // note the cast, and the fact that // x + 3 is *not* dereferenced. 语句中的问题,printf的类型为*(x + 3),而不是int,与char *转换不兼容符。再次,为了使这个“工作”,你会做类似

的事情
%s

您真的不希望以这种非结构化的方式将不同类型的数据存储在同一个内存缓冲区中;除非你真的知道自己在做什么,否则会导致大量的胃灼热。