C语言的sizeof操作符

复习一下linux c编程,写了个hello world,发现linux c的api已经被我忘记的差不多了,平时都在用golang写代码,只是知道后面有系统调用这回事情,但是自己操作起linux C的编程api起来好像不是那么回事了,这里写一片博客记录一下。

1
2
3
4
5
6
7
8
9
#include <unistd.h>
#include <stdio.h>

int main(){
int fd = dup(1);
char* buffer = "Hello World\n";
write(fd,buffer,sizeof(buffer));
return 0;
}

1
2
3
hellojukay@deepin:~/Data/Code/Linux/dup$ gcc dup.c
hellojukay@deepin:~/Data/Code/Linux/dup$ ./a.out
Hello Wohellojukay@deepin:~/Data/Code/Linux/dup$

这里并没有完整的输出Hello World这个字符串。我们来看在write这个系统调用返回的是什么。

1
2
3
4
5
6
7
8
9
10
11
12
#include <unistd.h>
#include <stdio.h>

int main(){
int fd = dup(1);
char* buffer = "Hello World\n";
int len = sizeof(buffer);
int count = write(fd,buffer,sizeof(buffer));
printf("%d chars wirte %d to stdout",len,count);
return 0;
}
`

1
2
3
hellojukay@deepin:~/Data/Code/Linux/dup$ gcc dup.c
hellojukay@deepin:~/Data/Code/Linux/dup$ ./a.out
Hello Wo8 chars wirte 8 to stdouthellojukay@deepin:~/Data/Code/Linux/dup$

这里打印出来了,8个字符全部都被写入了,等等,”Hello World”这个字符串怎么会只有8个字符,好像不对,是我蠢了,这个sizeof是编译器编译器期间决定的,他返回的”Hello World”这个字符串指针变量占用的内存的大小,而不是指代字符串本身所用的内存,所以这里应该使用strlen函数来获取字符串的长度,蠢了蠢了。

1
2
3
4
5
6
7
8
9
10
11
12
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(){
int fd = dup(1);
char* buffer = "Hello World\n";
int len = strlen(buffer);
int count = write(fd,buffer,len);
printf("%d chars wirte %d to stdout",len,count);
return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(){
int fd = dup(1);
char* buffer = "Hello World\n";
int len = strlen(buffer);
int count = write(fd,buffer,len);
printf("%d chars wirte %d to stdout",len,count);
return 0;
}

这样就对了。