这段代码存在以下问题:
#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/