我对此代码存在以下问题:
#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不同?
答案 0 :(得分:1)
您尝试从套接字读取verify
指向的内存区域"fail"
。
在C中,表达式"fail"
在只读内存中分配5个字节,在编译时用{'f','a','i','l','\0'}
填充它们并返回其地址。
所以你试图覆盖只读内存。我想知道为什么你没有得到分段错误。您检查了read
的返回值吗?它可能是read
中的内核端健全性检查,这可以防止它尝试写入RO内存。
在第二次read
调用中,没关系,因为b
指向数组变量的开头,这是可写的。
您实际上对自己的编码风格感到困惑:定义fail
,它看起来像一个变量,并不会使它成为一个变量。 C预处理器只是替换它,你最终得到
char *verify = "fail";