gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:55 25 4
gpt4 key购买 nike

我有一个问题:我尝试使用系统调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com