【问题标题】:Adding Two Arrays Yields Unstable Return添加两个数组会产生不稳定的回报
【发布时间】:2015-06-20 00:44:04
【问题描述】:

我创建了一个脚本来添加两个数组,如下所示。当执行下面的代码时,它不会产生一致的结果。每次执行脚本时,我都会收到不同的答案。我很想知道造成这种结果的原因是什么。

//
//  main.c

#include <stdio.h>
#include <unistd.h>

int *AddArrays(int *A, int *B, int a, int b);

int main(void)

{
    int A[5] = {1,2,3,4,5};
    int B[7] = {6,7,8,9,10,11,12};
    int a = 5;
    int b = 7;
    int c = a + b;
    int x = 0;
    int NewArray[c], *ArrayPtr;
    
    ArrayPtr = AddArrays(A,B,a,b);

    for( x = 0; x < c; x++)
    {
        *(NewArray + x) = *ArrayPtr;
        
        printf("Value of NewArray[%d] = %d\n", x, *(NewArray+x));
        sleep(1);
        
        ArrayPtr++;
    }
    
    
    return 0;
}

int *AddArrays(int *A, int *B, int a, int b)
{
    int c;
    int d;
    int NewArray[a+b];
    
    for (c = 0; c < a; c++)
    {
        NewArray[c] = *A;
        A++;
        
    }
    
    for (d = 0; c < d; d++)
    {
        NewArray[a] = *B;
        a++;
        B++;
    }
    
    return NewArray;
}

【问题讨论】:

  • 当您在调试器中运行此代码时发现了什么?
  • 它构建成功,但输出没有打印附加了“B”的数组“A”。相反,它会打印“1”、“2”,然后是随机数,然后是最后一个数组单元格值的“0”。
  • 那不是调试器的输出。另请注意,这不是比赛。 奖金问题没有“必要”。 (如果你认为类型实际上是“奇怪的”,你应该重新阅读关于类型的章节和关于编程范式的章节。
  • 调试器不应给出“错误消息”。注意:要对另一位发帖人发表评论,请使用众所周知的语法@name" 不会通知该收件人。这不是教程网站,而是问答论坛。
  • 我有一个问题。有人给了我答案。

标签: c arrays pointers


【解决方案1】:

理由使用malloc

此声明:

return NewArray;

返回指向数组第一个元素的指针。但是您在堆栈上声明了数组(即不是动态的,没有malloc),所以一旦控制权离开函数,数组就会超出范围并且不再安全使用。你以后使用它会导致未定义的行为,如果你得到的只是随机数,你就很幸运了。

NewArray 设为静态不是一个好的解决方案。一方面,这意味着您只能使用该函数一次——如果您再次调用它,它将用新参数的内容覆盖数组,并且前一次调用的结果将以您几乎当然不是故意的。

你也可以在函数外声明NewArray并传入一个指向它的指针;两种设计之间的选择取决于具体情况,但如果您想学习该语言,那么我建议您同时尝试。

【讨论】:

  • 谢谢!我做了第二个解决方案,它最终按照其他海报的建议工作。如果我要使用 malloc(),我是否为函数内的数组分配空间?然后这也可以解决问题并使数组值不受临时本地范围的影响?
  • @JCodder:是的,是的。不要忘记调用AddArrays 的代码负责在不再需要时删除数组。 (这是一种很好的做法,不是对语言的严格要求。)对于您的“额外问题”,请查看 模板。
  • @beta:“模板”?那是 C,不是 C++。
  • @Olaf:模板在 C++ 中是合法的,如果你能告诉我在没有模板的情况下在 C++ 中实现它的好方法,我将不胜感激。
  • @Beta:嗯,C 和 C++ 是不同的语言。问题是关于 C,而不是 C++。您的评论确实暗示 C 中有模板。对于仍然了解 C 基本功能的初学者(或您评论的其他新手读者)来说,这可能不是一个好主意。
【解决方案2】:

在 AddArray 的第二个循环中,您需要 d

【讨论】:

  • 谢谢。我意识到我需要在函数中使数组静态,但它不会让我,因为它是可变长度的。我重新运行程序并将函数中的 NewArray 长度更改为 [12] 并将其设为静态。该程序执行良好,但 B 附加错误。您的回答解决了这个问题,但我仍然不知道如何在函数中使其成为静态。
  • 抱歉,在编译完您的代码后,我意识到您的问题有两个方面。您正在返回 AddArray 内的局部变量 NewArray,这在 NewArray 执行后不能保证是任何东西,这就是您看到奇怪输出的原因。您可能应该在 AddArray 中传递一个指向要复制到的最终数组的指针并写入该数组,而不是让函数返回任何内容。
  • 非常感谢!这就说得通了。我现在尝试添加一个指针参数。
  • @JCodder:如果你将指针返回到一个static 本地数组,想想如果你第二次调用该函数会发生什么,同时仍然需要第一次调用的值。
  • 是的,我能够通过将新数组指针(在函数外部声明)作为参数传递并使用该指针作为附加值的基础来解决问题。该函数现在返回 void,因为不需要返回任何内容。
猜你喜欢
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多