为什么改这里sizeof(buf-1)会是输出三个字符

C语言 码拜 8年前 (2016-04-22) 1096次浏览
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
int fd=open(“passwd3”,O_RDWR);//fd文件指针
if(fd==-1)
{
perror(“open:”);
exit(-1);
}
lseek(fd,3,SEEK_SET);
// lseek(fd,0,SEEK_END);
// lseek(fd,-3,SEEK_END);
char buf[1024];
bzero(buf,sizeof(buf));//字符串清0
read(fd,buf,sizeof(buf-1));//就是这里的问题 本人搞不懂-1放在括号里面怎么就只输出3位字符了
printf(“%s\n”,buf);
close(fd);
return 0;
}
求高手们解释QAQ
解决方案

10

sizeof(buf)是求数组的大小是1024.
buf-1时buf退化为char*,所以sizeof(buf-1)是救char*指针的大小是4,或许是留1位终止符,所以只能显示3个字符了吧.
你是想sizeof(buf)-1吧。

40

你这个写法相当于是buf数组下标为-1的地址。
题主sizeof(buf-1)就知道是4,被当作了指针,所以输出了3个字符
数组下标为-1的地址对于数组来说是越界访问了,但是这个地址是有意义的
这个地址就是所申请的数组存储空间的首地址的向前偏移一个单位(也就是偏移一个当前数组类型所对应的字节数)所对应的地址。
这个地址由于没有跟着数组空间一起初始化,
所以其中的数据是不一定的,
假如是正在被系统或其他APP使用中的地址空间,那么可以被访问,其中的数据的意义取决于被系统或其他APP所写入的数据,但是访问后,有可能会引起系统或其他APP异常。
假如是没有被使用的地址,那么就是一个野地址,那么其中的数据是随机的,无意义的

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为什么改这里sizeof(buf-1)会是输出三个字符
喜欢 (0)
[1034331897@qq.com]
分享 (0)