【发布时间】:2017-06-02 15:50:46
【问题描述】:
我正在使用以下代码从套接字读取:
char buf[4097];
int ret = read(fd, buf, sizeof(buf) - 1);
buf[ret] = 0x0;
std::cout << buf << "\n";
但是,我不喜欢其中需要 4097 和 sizeof(buf) - 1。就是那种很容易忘记的东西。所以我想知道,是否有一些好方法可以强制编译器将 0x0 直接放在数组之后的堆栈上?
我想要的是类似的东西
char buf[4096];
char _ = 0x0;
int ret = read(fd, buf, sizeof(buf));
buf[ret] = 0x0;
std::cout << buf << "\n";
但我不知道如何强制编译器不要,但介于两者之间(afaik #pragma pack 仅适用于结构,不适用于堆栈)。
【问题讨论】:
-
喜欢...
char buf[4097] = {0};?这叫“初始化”…… -
char _无效。你不能这样命名字符。 -
如果您使用 C++ 编程,请仅使用该标签,即使部分问题可能与 C 有关。C 和 C++ 大部分是两个 非常 不同的语言,具有非常不同的语义。
-
@LethalProgrammer 单个下划线是合法符号。两个,三个或更多。唯一的限制是在所有范围内为编译器和标准库保留以两个下划线开头的名称。
-
如果数据是字符串(并且您的代码暗示它是),请使用
fgets。但是,是的,动机并不令人信服。