C中的fwrite在输出文件中给出不同的值

fwrite in C giving different values in output files

为什么我在另一个函数中使用 fwrite 与在同一函数中使用 fwrite 时输出文件不同?

output1.txt 包含像 Ê 这样的垃圾值,这是不正确的

output2.txt包含"b",是正确的

#include <stdio.h>
#include <string.h>

void writeData(char *buf, char *path) {
    FILE *fp1;
    fp1 = fopen(path, "a");
    fwrite(&buf, sizeof(char), strlen(buf), fp1);
}

int main () {


    char buf[2] = "a";
    char buf2[3] = "yb";
    char file1_path[12] = "output1.txt";
    char file2_path[12] = "output2.txt";
    memset(buf, 0, sizeof(buf));
    memcpy(buf, &buf2[1], strlen(buf2));
    printf("%s\n", buf);

    writeData(buf, file1_path);

    FILE *fp2;
    fp2 = fopen(file2_path, "a");
    fwrite(&buf, sizeof(char), strlen(buf), fp2);

   return(0);
}

在函数writeData change

fwrite(&buf, sizeof(char), strlen(buf), fp1);

fwrite(buf, sizeof(char), strlen(buf), fp1);

writeData 函数中,在您对 fwrite 的调用中:

fwrite(&buf, sizeof(char), strlen(buf), fp1);

变量buf是指向要写入的字符串中第一个字符的指针。类型char *。然而表达式 &buf 是一个指向变量 buf 的指针,它的类型是 char **。不是同一个数据。


如果 buf 是一个 数组 则有效,因为 buf(实际上是 &buf[0])和 &buf指向同一个位置。但它们仍然是不同的类型。

例如

char buf[2];

然后 buf 衰减 指向数组第一个元素(即 &buf[0])的指针,类型为 char *。表达式 &buf 是指向数组 的指针 ,类型为 char (*)[2].

有点图形化

+--------+--------+
| buf[0] | buf[1] |
+--------+--------+
^
|
&buf[0]
|
&buf

指向同一位置的两个指针,但类型不同,语义不同。

writeData() 应该调用 fwrite(buf, ...) 而不是 fwrite(&buf, ...)