获取分段错误:11,在 get_string
Getting Segmentation Fault: 11, on get_string
我正在试用 CS50 库中的 get_string
。 get_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
。这不是一个好的解决方案,但我现在能给你的就是这些了。
请仅在第一种方法无效时使用此方法。
进入你安装cs50的目录
通过发出命令sudo make uninstall
卸载它
在任何文本编辑器中从子目录 src
打开文件 cs50.h
搜索所有出现的 get_string
并将其替换为 get_string2
(我在第 108 行有一个,在第 109 行有两个)
保存并关闭文件
在任何文本编辑器中从子目录 src
打开文件 cs50.c
搜索并替换所有出现的 get_string
为 get_string2
(有很多)
保存并关闭文件
return 到原始 cs50 构建目录和 运行 命令:
make clean
make
sudo make install
进入目录hello.c
编辑 hello.c
并将 get_string
替换为 get_string2
用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
从现在开始,您需要将代码中每次使用 get_string
更改为 get_string2
提交代码时别忘了改回来。
或者,您可以在程序的开头放置类似这样的内容:
#ifndef get_string2
#define get_string2 get_string
#endif
...这意味着对于其他人 运行 使用您的代码(并且没有宏 get_string2
)这将定义 get_string2
与 [=15= 相同] - 所以你的代码将适用于修改和未修改的库。
同样,这显然不是最好的方法,但由于我无法测试,这是我能想到的最好方法。对不起。
如果有人提出更好的方法 - 那就太好了
我正在试用 CS50 库中的 get_string
。 get_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
。这不是一个好的解决方案,但我现在能给你的就是这些了。
请仅在第一种方法无效时使用此方法。
进入你安装cs50的目录
通过发出命令
卸载它sudo make uninstall
在任何文本编辑器中从子目录
src
打开文件cs50.h
搜索所有出现的
get_string
并将其替换为get_string2
(我在第 108 行有一个,在第 109 行有两个)保存并关闭文件
在任何文本编辑器中从子目录
src
打开文件cs50.c
搜索并替换所有出现的
get_string
为get_string2
(有很多)保存并关闭文件
return 到原始 cs50 构建目录和 运行 命令:
make clean
make
sudo make install
进入目录
hello.c
编辑
hello.c
并将get_string
替换为get_string2
用
编译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
从现在开始,您需要将代码中每次使用
get_string
更改为get_string2
提交代码时别忘了改回来。
或者,您可以在程序的开头放置类似这样的内容:
#ifndef get_string2
#define get_string2 get_string
#endif
...这意味着对于其他人 运行 使用您的代码(并且没有宏 get_string2
)这将定义 get_string2
与 [=15= 相同] - 所以你的代码将适用于修改和未修改的库。
同样,这显然不是最好的方法,但由于我无法测试,这是我能想到的最好方法。对不起。
如果有人提出更好的方法 - 那就太好了