我试图从cs50中的pset2完成破解,并且在编译代码时没有引发任何错误,但是当我运行代码时却引发了某种错误。
我尝试消除代码的不同部分,发现消除所有的for循环后,错误不再显示
int main(int argc, string argv[])
{
if (argc == 2)
{
printf("%s", crypt(argv[1], "hi"));
string letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", mess[1];
int sl = strlen(letters);
for (int x = 0; x < sl; x++)
{
mess[0][0] = letters[x];
for (int y = 0; y < sl; y++)
{
mess[0][1] = letters[y];
for (int z = 0; z < sl; z++)
{
mess[0][2] = letters[z];
for (int a = 0; a < sl; a++)
{
mess[0][3] = letters[a];
for (int b = 0; b < sl; b++)
{
mess[0][4] = letters[b];
printf("%s", mess[0]);
}
}
}
}
}
}
else
{
return 1;
}
}
我希望遍历5个字母组合的每个可能组合,并输出这5个字母的字符串。相反,它会返回:
UndefinedBehaviorSanitizer:DEADLYSIGNAL
==665==ERROR: UndefinedBehaviorSanitizer: SEGV on unknown address 0x000000402a60 (pc 0x000000428037 bp 0x7ffd0ab11070 sp 0x7ffd0ab10e60 T665)
==665==The signal is caused by a WRITE memory access.
#0 0x428036 in main /root/sandbox/test.c:16:24
#1 0x7f16d0022b96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310
#2 0x402a89 in _start (/root/sandbox/test+0x402a89)
UndefinedBehaviorSanitizer can not provide additional info.
==665==ABORTING
我想知道此错误的含义,发生的原因以及以后如何避免该错误
答案 0 :(得分:1)
在cs50中,kind: CronJob
metadata:
name: create-zip-upload
spec:
schedule: "27 5 * * *" # everyday at 05:27 AM
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: mycontainer
image: 123456789.my.region.amazonaws.com/mycompany/myproject/rest:latest
args:
- /usr/bin/python3
- -m
- scripts.createzip
是string
的typedef。 char *
的类型为mess[0]
,但从未初始化。您要么需要使用char *
malloc
或者您可以使用mess[0] = malloc(somesize * sizeof *mess[0]);
数组:
char
还要注意,如果要使用char mess[1][somesize];
打印mess
,则必须以NUL终止。
答案 1 :(得分:0)
string mess[1];
string
来自cs50
,来自here,类型为char *
。
所以等于:
char *mess[1];
是一个元素的未初始化数组。元素类型是指向字符的指针。
mess[0][0] = ...
这是采用非初始化指针mess[0]
并对其进行解引用和分配。 mess[0]
未初始化,因此它是一个无效的指针,分配给mess[0][0]
是无效的-那里没有有效的内存。没有要写入的内存。
您可以分配内存,即。
mess[0] = malloc(256 * sizeof(char));
即。将为256个字符(如果成功)分配内存,并返回指向该内存区域的指针。指针存储在数组mess
的第一个成员中。然后mess[0]
会指向只为您的程序分配的某个内存区域,有效区域为256个字符。