【问题标题】:Why does my array print numbers that are different to the numbers printed during assigning process?为什么我的数组打印的数字与分配过程中打印的数字不同?
【发布时间】:2015-08-08 15:26:58
【问题描述】:

我正在使用字符的 ASCII 值来执行此操作:abs(string[j-1] - string[j]) 并将其存储在整数数组“arraynum2”中。 ('string' 包含 4 个字符)

for(int j = length; j > 0; j--) {
        int num = 0;
        number2 = abs(string[j-1] - string[j]);
        printf("second %d\n", number2);
        arraynum2[num] = number2;
        printf("second %d\n", arraynum2[num]);
        num++;
    }

上面的 for 循环打印正确的数字,如 number2 == arraynum2[num]

但是当我打印出下一个 for 循环时,会打印出不同的数字:

    for(int k = 0; k < length; k++) {
        printf("arraynum2 has: %d\n", arraynum2[k]);
        /*
        if(arraynum1[k] != arraynum2[k]) {
            return 0;
        }
        */
    }

例如,数组应包含:122、2、21、2。 但在第二个 for 循环中,它会打印出:2, 0, 673946096, 32730。

谁能解释我做错了什么或我没有看到什么?

【问题讨论】:

  • 请贴一个小,编译干净,显示问题代码。然后我们可以正确地帮助你。事实上,有几个关键的未公开细节,例如:1)长度值 2)字符串 [] 的定义。如果 sizeof(string) 等于长度,则代码访问超出 string[] 末尾的内存。 IE。运行时问题需要可运行的代码。

标签: c arrays output


【解决方案1】:

您很可能通过尝试读取超出范围来触发未定义的行为

for(int j = length; j > 0; j--) {
        int num = 0;
        number2 = abs(string[j-1] - string[j]);

如果您的 string[] 数组的大小为长度,则定义如下

int string[length];

那么最后一个索引是length - 1

此外,在第一个循环中,您错误地分配给arraynum2,因为您始终只使用0 索引:

int num = 0;
number2 = abs(string[j-1] - string[j]);
printf("second %d\n", number2);
arraynum2[num] = number2;
           ^
        // num is always 0 here

解决方案:

检查你没有触发UB并初始化一次num,在for循环的初始化步骤中:

for(int j = length, num = 0; j > 0; j--) {
        number2 = (...);
        arraynum2[num] = number2;
        num++;
}

【讨论】:

    【解决方案2】:

    在您的第一个循环中,您在每次迭代时将num 重新初始化为0。所以你每次只分配给第一个元素arraynum2[0]

    初始化num你的第一个循环:

    for (int j = length; j > 0; j--) {
        int num = 0;
    

    或者:

    for (int j = length, num = 0; j > 0; j--) {
        int num = 0;
    

    另外,正如其他人指出的那样,索引length 可能超出了字符串的范围(您没有显示string 的定义)。因此,您可能需要在索引 length - 1 处开始循环。

    【讨论】:

    • 啊!谢谢,解决了:D
    • 或者完全抛弃num,只使用[length-j]作为数组下标,尽管我仍然同意tinky;无论如何,都有可能超出界限。
    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 2018-09-15
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多