c - 读取套接字和内存未按预期工作

标签 c sockets

这段代码存在以下问题:

#define success "success"
#define fail "fail"
char *verify = fail;
char b[1024];

int main(){
   ...
   ...connect to server code...
   ...
   read(sock,verify,1024);
   printf("%s",verify); //there's the problem, it always prints fail. If I change with this:
   read(sock,b,1024);
   printf("%s",b); //this works and prints the received string.
}

你能帮我理解一下吗?问题出在这部分代码中还是我应该检查其他地方?

如果我在代码中进行简单的分配,例如“verify=success”,它似乎工作正常,从 socked 读取与分配不一样?

最佳答案

您尝试从套接字读取verify指向的内存区域,结果“fail”。 在 C 中,表达式 "fail" 在只读内存中分配 5 个字节,并用 {'f','a','i','l','\0' 填充它们} 在编译时并返回其地址。

所以您正在尝试覆盖只读内存。我想知道为什么你没有出现段错误。你检查read的返回值了吗?这可能是 read 中的内核端健全性检查,阻止它尝试写入 RO 内存。

在第二个 read 调用中,没有问题,因为 b 指向数组变量的开头,该变量是可写的。

您实际上将自己与自己的编码风格混淆了:定义看起来像变量的 fail 并不会使其成为变量。 C 预处理器只是替换它,最终得到

char *verify = "fail";

关于c - 读取套接字和内存未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26559656/

相关文章:

Perl关闭套接字

java - 一次读取一个 inputStream

c - 帮助理解 x86 内联汇编中的 DIV 指令

javascript - Socket 无法加载资源服务器(404 错误)

Python套接字编程和ISO-OSI模型

c - 了解 GetMessage() 与 LowLevelKeyboardProc Hook 的结合

Python 线程未处理的异常

CreateWindow失败,错误50(不支持该请求。)

c - C 编程中的结构指针

c++ - 为什么结构大小与项目大小的简单总和不匹配?