给定部分代码:

char bmpheader[54] = {0x42, 0x4D, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

char bmpimagedata[36] = {0x07, 0x07, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x66, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0x46, 0x00, 0x00};


while (i < 54) {
    printf("%c", bmpheader[i]);
    write (socket, bmpheader[i], 1);
    i++;
}
while (j < 36) {
    printf("%c", bmpimagedata[j]);
    write (socket, bmpimagedata[j], 1);
    j++;
}

我的编译器出现了一个错误,两个写函数都是passing argument 2 of 'write' makes pointer from integer without a cast。我不太确定函数的参数本身(第三个参数是否正确?).
我该怎么纠正?

最佳答案

标准write函数接受一个指向您要写出的内容的指针;您将向它传递一个char(它将被提升为int)。
最起码的解决办法是改变这一点:

write (socket, bmpheader[i], 1);


write (socket, &bmpheader[i], 1);

……但还有更好的办法。
您可以让write自己写出所有54个字节:
write (socket, bmpheader, 54);

或者如果你真的想一次做一个char,你可以使用一个指针:
int i;
char *p;
for (i = 0, p = bmpheader; i < 54; ++i, ++p) {
    printf("%c", *p);
    write (socket, p, 1);
}

无论是哪种情况,您都希望避免这个神奇的数字54,并从数据中获取它。因为sizeof(char)always one byte in standard C,所以您可以使用sizeof而不必执行丑陋的sizeof(array) / sizeof(array[0])操作:
int i;
char *p;
for (i = 0, p = bmpheader; i < sizeof(bmpheader); ++i, ++p) {
    printf("%c", *p);
    write (socket, p, 1);
}

……但我相信还有比这更优雅的解决方案。
您也可以使用putchar(相当轻)而不是printf(相当重):
int i;
char* p;
for (i = 0, p = bmpheader; i < sizeof(bmpheader); ++i, ++p) {
    putchar(*p);
    write (socket, p, 1);
}

我以前用指针算法做过这样的事情,不知道它们在现代社会是不是不好的做法:
char* p;
char* endp;
for (p = bmpheader, p = bmpheader + sizeof(bmpheader); p < endp; ++p) {
    putchar(*p);
    write (socket, p, 1);
}

10-07 14:25
查看更多