需要理解一个用输出覆盖输入的简单例子
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 个数组(input
和 output
),我计算 input
数组每个值的平方,然后将结果存储在 output
数组。我通过为 computeSquare
函数的每次调用分配 output
和 input
来重复该过程:我使用 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 类型(对于更大的数字仍然会溢出)。
我的问题可能很愚蠢,但我需要了解一个关于函数中先前输出值覆盖输入值的简单示例。
这是这个简单的代码片段:
#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 个数组(input
和 output
),我计算 input
数组每个值的平方,然后将结果存储在 output
数组。我通过为 computeSquare
函数的每次调用分配 output
和 input
来重复该过程:我使用 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 类型(对于更大的数字仍然会溢出)。