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,…)