读取套接字和记忆不能按预期工作

时间:2014-10-25 05:42:36

标签: 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',它似乎工作正常,从袜子中读取与asisgnation不同?

1 个答案:

答案 0 :(得分:1)

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

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

在第二次read调用中,没关系,因为b指向数组变量的开头,这是可写的。

您实际上对自己的编码风格感到困惑:定义fail,它看起来像一个变量,并不会使它成为一个变量。 C预处理器只是替换它,你最终得到

char *verify = "fail";