为什么我的 C 代码在乘以这个 int 后一直崩溃?

问题描述 投票:0回答:3

我编译了这段代码:

#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 调试器对其进行了调试,但我找不到任何编译器错误或任何类似的东西。

c char crash codeblocks
3个回答
2
投票

你的程序因为这一行而崩溃:

printf("key: %s", keyi);

%s
需要一个指向以空字符结尾的字符串(
char[]
数组)的指针。您正在传递保存在
char
变量
keyi
中的值,该值被转换为指向
char
的指针。这是Undefined Behaviour,它可能表现为段错误。

程序的其余部分也是错误的。但@AkashSingh_1 在他的回答中对此进行了解释。


0
投票

代码有一些问题可能导致它崩溃:

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;
}

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)
。或者你可以

© www.soinside.com 2019 - 2024. All rights reserved.