尝试执行 CS50 Crack 加密问题时出现分段错误。我是C语言的新手。代码可以编译,但是当我运行调试器时,似乎会出现以下错误:
Process received SIGSEGV: Segmentation fault
...at guess[0] = *alphabet1;
我研究了其他堆栈溢出问题,并怀疑它可能与string
猜测为字符串文字有关,但这对我来说是一团糟。您能否向我解释为什么我会遇到细分错误或将我定向到一个好的网页来对此进行研究。相关代码如下。
string guess = " ";
string hashed_word = " ";
string letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ";
string letters1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *alphabet;
char *alphabet1;
//check a-Z
for (int j = 0; j < 52; j++)
{
alphabet1 = &letters1[j];
guess[0] = *alphabet1;
hashed_word = guess;
if (strcmp(hashed_word, s) == 0)
{
print(guess);
}
}
答案 0 :(得分:4)
CS50头文件cs50.h
定义
typedef char *string;
因此,当您定义和初始化
string guess = " ";
这与
相同char *guess = " ";
,因此您将guess
的值分配为指向字符串文字。
因此,当您猜中问题时,这就是问题所在
guess[0] = *alphabet1;
尽管您可能会更改指针的值,例如,如果您想在程序中更改默认响应,则不得写入字符串文字的数据。
答案 1 :(得分:0)
由于您没有向我们显示您所包含的具体标题,所以我想它是cs50.h
。
该标头定义:typedef char * string
。
char * guess = " ";
在这里,您在堆栈上分配了一个char指针,该指针指向字符串文字。字符串文字通常位于特殊的段中。 (主要是rodata,但标准并未规定该位置)。
但是C99标准说:
示例8:声明
char s[] = "abc", t[3] = "abc";
定义“普通”字符数组对象s和t,其元素使用字符串文字初始化。
此声明与
相同char s[] = { 'a', 'b', 'c', '\0' }, t[] = { 'a', 'b', 'c' };
数组的内容是可修改的。另一方面,声明
char *p = "abc";
定义类型为“ char的指针”的p并将其初始化为指向长度为4的类型为“ char的数组”的>对象,其元素使用字符串文字进行初始化。如果尝试使用> p修改数组的内容,则该行为为未定义。