需要理解一个用输出覆盖输入的简单例子

Need to understand a simple example of overwritting the input by the output

我的问题可能很愚蠢,但我需要了解一个关于函数中先前输出值覆盖输入值的简单示例。

这是这个简单的代码片段:

#include <stdio.h>
#include <stdlib.h>

void computeSquare(int input[], int output[]) {

    int i;

    for (i = 0; i < 5; i++)
        output[i] = input[i] * input[i];
}

int main(void) {

    int i, j;

    int input[5];
    int output[5];
    int *ptr;

    for (i = 0; i < 5; i++)
        input[i] = i;

    // Pointer to do the link between 2 calls of computeSquare
    ptr = input;

    for (j = 0; j < 5; j++) {
        computeSquare(ptr, output);
        ptr = output;
    }

    for (j = 0; j < 5; j++)
        printf("output[%d] = %d\n", j, output[j]);

}

如您所见,我有 2 个数组(inputoutput),我计算 input 数组每个值的平方,然后将结果存储在 output数组。我通过为 computeSquare 函数的每次调用分配 outputinput 来重复该过程:我使用 ptr 指针执行此操作。

我不明白为什么我在执行时没有得到有效结果(当我打印 output 值时)。

我认为我可以使用相同的地址(实际上是函数的第一个和第二个参数的第一个元素的地址):

computeSquare(ptr, output);
  ptr = output;

我认为,在 computeSquare 函数中,我可以:

 output[i]= output[i]*output[i];

这样 output[i] 值将替换为 output[i]*output[i]

不知道我的推理哪里不好,

谢谢

你的程序太复杂,这种简化的方法打印正方形数组

#include <stdio.h>

#define ARRLEN 5

void computeSquare(int input[], int output[]) {
    int i;
    for (i=0; i<ARRLEN; i++)
        output[i] = input[i] * input[i];
}

int main(void) {
    int i;
    int input[ARRLEN];
    int output[ARRLEN];
    for (i=0; i<ARRLEN; i++)
        input[i] = i;
    for (i=0; i<ARRLEN; i++)
        computeSquare(input, output);
    for (i=0; i<ARRLEN; i++)
        printf("output[%d] = %d\n", i, output[i]);
    return 0;
}

程序输出:

output[0] = 0
output[1] = 1
output[2] = 4
output[3] = 9
output[4] = 16

但是,仔细观察,您说您想用它们的正方形覆盖输入值。当我试图修改它以覆盖它失败的原始输入值时,因为您为每个数组元素调用该函数,而该函数又计算每个数组元素。结果是

input[0] = 0
input[1] = 1
input[2] = 0
input[3] = -501334399
input[4] = 0

所以我的第一个代码成功了,但是要覆盖传递的值,你必须摆脱其中一个双循环,我选择在 main 而不是在函数中这样做,就像这样

#include <stdio.h>

#define ARRLEN 5

void computeSquare(int input[]) {
    int i;
    for (i=0; i<ARRLEN; i++)
        input[i] = input[i] * input[i];
}

int main(void) {
    int i;
    int input[ARRLEN];
    for (i=0; i<ARRLEN; i++)
        input[i] = i;
    computeSquare(input);         // <-- don't iterate, because the function does
    for (i=0; i<ARRLEN; i++)
        printf("input[%d] = %d\n", i, input[i]);
    return 0;
}

程序输出:

output[0] = 0
output[1] = 1
output[2] = 4
output[3] = 9
output[4] = 16

推理正确,答案正确。只是值溢出了 int。将数组转换为浮点数,它将正常工作。

#include <stdio.h>
#include <stdlib.h>

void computeSquare(float input[], float output[]) {

  int i;

  for (i=0; i< 5; i++)
     output[i]= input[i]*input[i];
  }

int main(void) {

  int i,j;

  float input[5];
  float output[5];
  float *ptr;

  for (i=0; i<5; i++)
     input[i] = i;

  // Pointer to do the link between 2 calls of computeSquare
  ptr = input;

  for (j=0; j<5; j++)
     {
      computeSquare(ptr, output);
      ptr = output;
for (int k=0; k<5; k++)
     printf("output[%d] = %f\n", k, output[k]);
     }
for (j=0; j<5; j++)
     printf("output[%d] = %f\n", j, output[j]);


  return 0; }

我认为你在这里溢出了一个整数(因为你重复了你的方块五次):

for (j=0; j<5; j++)
{
    computeSquare(ptr, output);
    ptr = output;
}

对于0和1无论乘多少次都不会改变值。然而,即使是 2,每次迭代后你会得到的结果是:

it 0: 2^1 * 2^1   = 2^2
it 1: 2^2 * 2^2   = 2^4
it 2: 2^4 * 2^4   = 2^8
it 3: 2^8 * 2^8   = 2^16
it 4: 2^16 * 2^16 = 2^32

虽然 int 的典型最大值是 2^31 - 1

尝试减少需要执行的迭代次数或使用 long 类型(对于更大的数字仍然会溢出)。