Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 读取套接字和记忆未按预期工作_C_Sockets - Fatal编程技术网

C 读取套接字和记忆未按预期工作

C 读取套接字和记忆未按预期工作,c,sockets,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. I

我对此代码有以下问题:

#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”,它似乎工作得很好,从一个socket读取与从一个asisgnation读取不一样?

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

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

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

实际上,您正在将自己与自己的编码风格混淆:定义
fail
,它看起来像一个变量,但并不使它成为一个变量。C预处理器只是替换了它,结果是

char *verify = "fail";

您正在写入只读内存(字符串literal
“fail”
)。我感到震惊的是,它甚至执行时没有出现错误,当然,除非你的套接字设置失败(双关语),并且导致的
read
是一个被忽略的错误导致的no-op。@WhozCraig该死,你有理由,这是一个多么愚蠢的问题:(谢谢!还有,
read()
不创建以null结尾的字符串。您不应在其输入缓冲区上使用字符串函数。@如果我也在服务器中定义字符串success,并将其发送到客户端,然后用read()读取,然后使用strcmp(success,b),这应该可以正常工作,对吗?另外,如果我从服务器向客户端发送以null结尾的字符串,这应该作为以null结尾的字符串存储在b中,对吗?不。如果这是流套接字,则没有消息边界。
read()
可能不会返回一次调用中写入的所有内容,您可能必须循环才能获取所有内容。