获取分段错误:11,在 get_string

Getting Segmentation Fault: 11, on get_string

我正在试用 CS50 库中的 get_stringget_string 函数似乎会导致分段错误。你有什么建议吗?

#include <cs50.h>
#include <stdio.h>
int main (void) {
    string answer = get_string("What's your name? ");
    printf("Hello, %s", answer);
}

好的,经过一番挖掘,我想我找到了罪魁祸首。而且它显然不是我们看的地方。

Mac OS X 显然有一个名为 get_string 的内置符号,这就是为什么它在没有库的情况下编译并且一直崩溃的原因。

这个问题可能有几种解决方法

编译cs50.c到你的二进制文件

此方法已被提及 here。我没有测试过它,但据说它有效。

像这样编译你的代码:

clang -ggdb3 -O0 -std=c99 hello.c ../../../github.com/cs50/lib50-c/src/cs50.c -o hello

其中 ../../../github.com/cs50/lib50-c/src/cs50.c 是文件 cs50.c 的路径,它位于 cs50 库源代码的子目录 src 中 - 如果它在您的计算机上不同,请使用正确的路径。

您也可以只将 cs50.c 文件复制到带有 hello.c 的目录,并且只指定 cs50.c 而没有路径

请注意,您必须在之后指定此文件,否则它将无法工作!

实际上,在那种情况下这应该足够了:

cc hello.c cs50.c -std=c99 -o hello

从现在开始,每次编译代码时,您都需要在之后包含cs50.c

重命名函数

因为我没有 Mac,所以我无法测试任何东西,所以将列出一种肯定有效的方法 - 将函数 get_string 重命名为 get_string2。这不是一个好的解决方案,但我现在能给你的就是这些了。

请仅在第一种方法无效时使用此方法。

  1. 进入你安装cs50的目录

  2. 通过发出命令sudo make uninstall

    卸载它
  3. 在任何文本编辑器中从子目录 src 打开文件 cs50.h

  4. 搜索所有出现的 get_string 并将其替换为 get_string2(我在第 108 行有一个,在第 109 行有两个)

  5. 保存并关闭文件

  6. 在任何文本编辑器中从子目录 src 打开文件 cs50.c

  7. 搜索并替换所有出现的 get_stringget_string2(有很多)

  8. 保存并关闭文件

  9. return 到原始 cs50 构建目录和 运行 命令:

make clean
make 
sudo make install
  1. 进入目录hello.c

  2. 编辑 hello.c 并将 get_string 替换为 get_string2

  3. cc hello.c -lcs50 -o hello编译,运行用./hello

    编译

您可能还需要在编译和执行之前发出以下命令:

export LIBRARY_PATH=/usr/local/lib
export C_INCLUDE_PATH=/usr/local/include
export LD_LIBRARY_PATH=/usr/local/lib
  1. 从现在开始,您需要将代码中每次使用 get_string 更改为 get_string2

  2. 提交代码时别忘了改回来。

或者,您可以在程序的开头放置类似这样的内容:

#ifndef get_string2
#define get_string2 get_string
#endif

...这意味着对于其他人 运行 使用您的代码(并且没有宏 get_string2)这将定义 get_string2 与 [=15= 相同] - 所以你的代码将适用于修改和未修改的库。


同样,这显然不是最好的方法,但由于我无法测试,这是我能想到的最好方法。对不起。

如果有人提出更好的方法 - 那就太好了