为啥指针不能传递正确的值(C)?
Posted
技术标签:
【中文标题】为啥指针不能传递正确的值(C)?【英文标题】:Why does the pointers cant pass the right values(C)?为什么指针不能传递正确的值(C)? 【发布时间】:2022-01-11 23:23:11 【问题描述】:我被赋予了这个任务:
编写一个接受整数数组“arr”及其大小的函数 “n”和一个整数“key”(已知数组至少有 2 整数)。
如果数组中有两个整数的和小于“key”,则该函数检查并返回 1,否则该函数 返回0。另外如果有满足这个条件的整数,函数会将它们的值传递给“n”和“key”,否则传递-1。
这是我的解决方案:
int ex5(int* arr, int* n, int* key)
while (*n > 0)
int i;
for (i = 0; i < *n - 1; i++)
if (arr[*n-1] + arr[i] < *key)
*n = arr[i];
*key = arr[*n-1];*
return 1;
--*n;
*n = -1;
*key = -1;
return 0;
这是我的主要功能:
int main()
int arr[] = 1, 6, 2, 4, 3, n = 5, key = 4;
int res = ex5(arr, &n, &key);
printf("%d %d %d", res, n, key);
但是,当我运行我的代码时,函数返回 1 并传递 (n = 1, key = 1)
,它应该传递 (n = 2, key = 1)
。
【问题讨论】:
ericlippert.com/2014/03/05/how-to-debug-small-programs 如果将*n
和*key
的值复制到局部变量中,整个事情会容易得多。然后编写两个嵌套的for
循环,找到一对满足条件的数组元素。
【参考方案1】:
*n = arr[i];
*key = arr[*n-1];
上面代码中的第二行读取arr[arr[i]-1];
这可能超出范围,例如arr[i]
是 1000,而数组中只有 5 个元素。数组中的值与数组大小之间没有关系。至少颠倒顺序:
*key = arr[*n-1];
*n = arr[i];
您还可以使用两个循环来简化代码。示例
int ex5(int* arr, int *size, int *key)
for (int i = 0; i < *size; i++)
for (int k = i + 1; k < *size; k++)
if (arr[i] + arr[k] < *key)
*key = arr[i];
*size = arr[k];
return 1;
return 0;
【讨论】:
【参考方案2】:为满足条件的循环写 2 个。
int ex5(int* arr, int *size, int *key)
int i=0;
while(i<*size)
int k=i+1;
while(k<*size)
if (arr[i] + arr[k] < *key)
*key = arr[i];
*size = arr[k];
return 1;
i++;
return 0;
【讨论】:
以上是关于为啥指针不能传递正确的值(C)?的主要内容,如果未能解决你的问题,请参考以下文章