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

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

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

output2.txt包含“b”,这是正确的

#include  #include  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函数中,在调用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, sizeof(char), strlen(buf), fp1); 

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

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