我应该将分配的内存归零吗?
Should I zero the allocated memory?
我正在编程 tcp 套接字,我正在使用 struct sockaddr_in server_addr;
设置端口等。在一些教程中我读到我应该在使用它之前将 server_addr
的内存清零。我是不是该?是否有可能我会得到一些可能导致问题的数据的内存? linux 和 windows 有什么不同吗?
谢谢
这样做是个好主意,尤其是在这种情况下。这些低级套接字 struct
有无数嵌套形式的小成员。 memset
确保其中 none 具有垃圾值。非常简单,效率比较高,还可以清除比较难发现的bug。
如果您不初始化保留内存区域,它将包含之前存储在那里的任何值。所以 "zero it" 总是一个好主意,这意味着用一些值覆盖曾经存在的内容,在本例中是空字节 [=10=]
.
如果您将 malloc
替换为 calloc
,这将自动为您完成。
无论您是否这样做,都不会影响您从套接字读取的值。
在 Windows 或 Linux/Unix 上执行此操作并不重要:这是所有环境的常见行为。
视情况而定。在重写之前是否要使用它?如果您确定在覆盖之前不会从内存中读取 - 您可以将内存置零(这将花费额外的程序工作时间并且需要更多代码 - 代码越少越好)否则你必须初始化带零的内存。
我正在编程 tcp 套接字,我正在使用 struct sockaddr_in server_addr;
设置端口等。在一些教程中我读到我应该在使用它之前将 server_addr
的内存清零。我是不是该?是否有可能我会得到一些可能导致问题的数据的内存? linux 和 windows 有什么不同吗?
谢谢
这样做是个好主意,尤其是在这种情况下。这些低级套接字 struct
有无数嵌套形式的小成员。 memset
确保其中 none 具有垃圾值。非常简单,效率比较高,还可以清除比较难发现的bug。
如果您不初始化保留内存区域,它将包含之前存储在那里的任何值。所以 "zero it" 总是一个好主意,这意味着用一些值覆盖曾经存在的内容,在本例中是空字节 [=10=]
.
如果您将 malloc
替换为 calloc
,这将自动为您完成。
无论您是否这样做,都不会影响您从套接字读取的值。
在 Windows 或 Linux/Unix 上执行此操作并不重要:这是所有环境的常见行为。
视情况而定。在重写之前是否要使用它?如果您确定在覆盖之前不会从内存中读取 - 您可以将内存置零(这将花费额外的程序工作时间并且需要更多代码 - 代码越少越好)否则你必须初始化带零的内存。