c - 提供一系列数字 (C) 的函数存在问题。为什么?
问题描述
我创建了一个函数,它根据一个数字提供一系列数字,以及您想要获得的数字数量与该数字不同(我知道,这种解释有点含糊,所以这里有一个例子):
Number of origin: 10
Number of numbers to count away from the origin: 5
Output:
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
所以这里是代码:
#include <stdio.h>
#include <stdlib.h>
void plusMinus(int*change, int num, int funcTo){
int range = funcTo * 2;
int start = num - funcTo;
int i;
for (i=0; i<=range; i++){
change[i] = start + i;
}
}
int main()
{
int* pointer;
plusMinus(&pointer, 250, 5);
int x;
for (x=0; x<=10; x++){
printf("%d\n", &pointer[x]);
}
return 0;
}
这是所需的输出:
245
246
247
248
249
250
251
252
253
254
255
这是当前的输出:
245
249
253
257
261
265
269
273
277
281
285
该代码还返回两个警告,但我不知道它们的含义。这是第一个:
warning: passing argument 1 of 'plusMinus' from incompatible pointer type [-Wincompatible-pointer-types]
这是第二个:
warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=]
解决方案
第一个函数参数具有类型int *
void plusMinus(int*change, int num, int funcTo){
但是你传递了一个类型的参数int **
int* pointer;
plusMinus(&pointer, 250, 5);
此外,指针pointer
未初始化并且具有不确定的值。结果,程序具有未定义的行为。
在这次呼吁中printf
printf("%d\n", &pointer[x]);
当您传递type 的对象时,转换说明符%d
需要一个 type的对象。int
int *
这是您更新的程序
#include <stdio.h>
void plusMinus( int *a, int num, int funcTo )
{
int range = 2 * funcTo + 1;
int start = num - funcTo;
for ( int i = 0; i <range; i++ )
{
a[i] = start + i;
}
}
int main(void)
{
int funcTo = 5;
int a[2 * funcTo + 1];
plusMinus( a, 250, funcTo );
for ( int i = 0; i < 2 * funcTo + 1; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
return 0;
}
它的输出是
245 246 247 248 249 250 251 252 253 254 255
把函数写成递归函数更有趣。
这个给你。
#include <stdio.h>
void plusMinus( int *a, int num, int funcTo )
{
a[0] = num - funcTo;
if ( funcTo )
{
plusMinus( a + 1, num, funcTo - 1 );
a[2 * funcTo] = num + funcTo;
}
}
int main(void)
{
int funcTo = 5;
int a[2 * funcTo + 1];
plusMinus( a, 250, funcTo );
for ( int i = 0; i < 2 * funcTo + 1; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
return 0;
}
程序输出与上图相同。
245 246 247 248 249 250 251 252 253 254 255
推荐阅读
- java - 使用给定电话号码和日期的firebase数据库自动发送短信
- java - Bootstrap 3 DataTable 导出到 Excel 不导出表数据
- java - 为什么要再次投射 SSLServerSocketFactory?
- java - Gradle:以编程方式为 compileJava 任务指定编译器选项
- java - 从@ResponseBody 返回 JSONArray 时抛出错误
- intellij-idea - 在 IntelliJ IDEA 中禁用 lint 标记
- android - 如何在 Android 中使用 Amazon Comprehend API
- php - 如何在php中发送带有换行符的电子邮件
- php - 我的登录页面不工作
- go - goroutine 值返回顺序