【问题标题】:Why are my integer values not being displayed or calculated correctly in C? [duplicate]为什么我的整数值没有在 C 中正确显示或计算? [复制]
【发布时间】:2017-08-14 11:22:50
【问题描述】:

顺便说一句,我是一名 PHP 程序员,想测试编写一个 C 程序,向其发送参数并使用shell_exec() 在 PHP 中使用它的输出。

无论如何,我编写这段代码只是为了将两个数字相加:

#include <stdio.h>

int leftop, rightop, result;

int main(int argc, char *argv[])
{
    leftop = (int) argv[1];

    rightop = (int) argv[2];

    result = leftop + rightop;

    printf("The result of %i add %i = %i\n", leftop, rightop, result);
    getchar();
    return 0;
}

我使用MinGW 使用gcc -o main.c mycprogram.exe 编译它。

当我运行程序时(使用shell_exec() (php) 或从命令行),我得到以下结果。

./mycprogram.exe 25 25

The result of 7150824 add 7149184 = 14300008

然后我再次运行它并得到:

The result of 6692040 add 6692072 = 13384112

显然我希望结果是50

为什么我没有得到正确的结果?

【问题讨论】:

    标签: c pointers command-line-arguments argv


    【解决方案1】:

    问题是,argv[1](通常是argv[n])是一个指向一个字符串的指针,它表示int 没有给你相应的整数,你可能已经传递为论据。

    也就是说,像

    这样的陈述的有效性
     leftop = (int) argv[1];
    

    严重依赖于实现,因为指针到整数转换的有效性是实现特定的行为。在某些情况下,它会导致undefined behavior

    解决方案:您应该使用strtol()字符串转换为整数类型。

    【讨论】:

    • 感谢您的回复,您能否解释一下为什么转换为 int 会导致我得到的值?只是为了帮助我了解 C 正在做什么?
    • @AdamCopley 已经更新了答案。
    • 那么我是否有效地将内存地址转换为整数?因此数字很大?
    • @AdamCopley 是的,对。
    • 啊哈再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多