我编译了这段代码:
#include <stdio.h>
int main(int argc, char *argv[]){
if(argc == 2){
printf("username: %s\n", argv[1]);
int key = 0;
key += (int)argv[1];
printf("1\n");
key = key * 2;
char keyi = (char)key;
printf("key: %s", keyi);
}
return 0;
}
(注意 printf("1 "); 仅用于调试) 它一直在我将关键变量乘以 2 的那一行崩溃。 我使用 codeblocks ide 和 gnu gcc 编译器编译了它。 您对如何解决它有任何想法吗?
我已经使用 x32gdb 调试器对其进行了调试,但我找不到任何编译器错误或任何类似的东西。
你的程序因为这一行而崩溃:
printf("key: %s", keyi);
%s
需要一个指向以空字符结尾的字符串(char[]
数组)的指针。您正在传递保存在 char
变量 keyi
中的值,该值被转换为指向 char
的指针。这是Undefined Behaviour,它可能表现为段错误。
程序的其余部分也是错误的。但@AkashSingh_1 在他的回答中对此进行了解释。
代码有一些问题可能导致它崩溃:
将
argv[1]
转换为 int
是不正确的。 argv[1]
是一个字符串,因此您需要使用 atoi()
或 strtol()
之类的函数将其转换为整数。否则,key
将被分配一个指针值而不是预期的整数值。
将
key
转换为 char
会导致精度损失。如果 key
是一个大数字,当您将其转换为 char
时它将被截断。相反,您应该使用像sprintf()
这样的函数将整数转换为字符串。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc == 2) {
printf("username: %s\n", argv[1]);
int key = atoi(argv[1]); // Convert string to integer
printf("1\n");
key = key * 2;
char key_str[20];
sprintf(key_str, "%d", key); // Convert integer to string
printf("key: %s\n", key_str);
}
return 0;
}
虽然你说你调试的时候什么都没发现,但如果你真的调试了,代码很可能在
printf("key: %s", keyi)
处崩溃了。
原因是 %s
期望一个字符串,这意味着指向有效地址的指针。
argv[1]
的类型是 char *
,所以你不应该用括号将它强制转换为 int。如果您希望将内容转换为 int,则应调用 int atoi(const char *nptr)
。通过直接将其转换为 int,乘以 2 并将其转换为 char。回想一下,char 的范围是 [-128, 127],这不在用户程序的有效地址范围内。当 printf("key: %s", keyi)
试图取消引用它时,它崩溃了。
我不确定你想用
char keyi = (char)key;
做什么。但是如果你想把数字打印出来。你可以打电话printf("key: %d", key)
。或者你可以