..

C语言的sizeof操作符

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

#include <unistd.h>
#include <stdio.h>

int main(){
    int fd = dup(1);
    char* buffer = "Hello World\n";
    write(fd,buffer,sizeof(buffer));
    return 0;
}
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这个系统调用返回的是什么。

#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;
}
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函数来获取字符串的长度,蠢了蠢了。

#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;
}
#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;
}

这样就对了。