c - 使用指针会导致段错误

标签 c linux sockets

我有一个问题: 我尝试使用系统调用 gethostname( char *name, size_t size ) 但我得到了一些我不理解的结果:

char *hostname;
gethostname( hostname, size );  //results in a segmentation error
gethostname( &hostname, size ); //works fine.

为什么要在这里使用 & 符号? gethostname 要求一个指针,但 hostname 已经是一个指针。 我只是偶然得到结果,不知道为什么第一个电话不起作用。 对不起,如果这是一个愚蠢的问题。

[编辑] 答案是:hostname 尚未分配任何内存,因此 gethostname 尝试访问未分配的内存,从而引发段错误。 此外,第二个 LOC 也不合法,它覆盖了堆栈上的其他数据并因此损坏了它。 使用方法是先分配一些内存,然后传递给gethostname系统调用。

感谢您的宝贵时间和信息! :)

最佳答案

gethostname 期望您传递一个缓冲区 以供写入。在 C 中,字符串被实现为字符数组,它可以衰减为指向字符串中第一个字符的指针

gethostname 将做的是将主机名放入您指定的缓冲区中,直到写入size 个字符。鉴于此,您需要给它一个有效的缓冲区来写入。在您的示例中,尚未为指针分配任何内容,因此指针的值未定义,它指向内存中的某个随机位置。尝试取消引用该指针然后未定义,因此程序出现段错误。

正如我所说,解决这个问题的方法是传入一个真实的存储区域。以下两种方法都是有效的:

char hostname[50];
gethostname(hostname, 50); // Valid as a char[] decays to char*
// ---------- OR ----------------
char hostname*;
hostname = malloc(sizeof(char)*50); // Actually give the pointer some storage.
gethostname(hostname, 50);

应该注意的是,它在你的第二个案例中是偶然的。 char* hostname 是存储在堆栈上的指针。 &hostname 将获取指针 hostname 的地址。由于 hostname 在堆栈上有一些有效的存储空间(用于存储它指向的地址),因此可以写入该地址,但您将开始覆盖堆栈上的有用数据。这将破坏程序的状态,并且它可能崩溃或变得不稳定。

关于c - 使用指针会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23982254/

相关文章:

c - 直到运行时才知道尺寸的二维数组

linux - 删除文本文件 bash 中的文件扩展名

c++ - 让 svn diff 在提交期间显示 C++ 函数

linux - 尝试创建具有相对路径的文件结构

python - 通过 LAN 发送较大数据 block 时 ZMQ 失败

带有原始套接字的python套接字setsockopt

java - TCP Byte Array 不工作,但 Printer Writer 工作?

c - 我需要从文件中读取数据,但无法从中读取全部值

c# - 如何计算文件的增量,即更改的文件部分

c - “返回”作为函数指针数组中的函数