我是编码的新手,开始学习指针,我陷入了一个问题。问题是将数组输入作为指针并使用指针打印相同的数组。如果您能指导我如何将变量从函数传递到main(),那也很好。谢谢
#include <stdio.h>
#include <stdlib.h>
int* record_array (int *size_ptr);
int* print_array (int *array_ptr [], int *size_ptr);
int* record_array (int *size_ptr)
{
int *array_ptr = (int*) malloc(*size_ptr*sizeof(int));
for (int index = 0;index < *size_ptr;++index)
{
printf("Enter element at index %d", index);
scanf("%d", &array_ptr[index]);
}
return array_ptr;
}
int* print_array (int *array_ptr [], int *size_ptr)
{
for (int index = 0;index < *size_ptr;++index)
{
printf("%d ",array_ptr[index]);
}
int *pass = array_ptr;
return pass;
}
int main()
{
int size = 0;
printf("How many elements do you want?");
scanf("%d", &size);
record_array(&size);
print_array(&array_ptr,&size);
free(pass);
return 0;
}
您已经关闭,但是在int *array_ptr []
中使用的int* print_array (int *array_ptr [], int *size_ptr)
不正确。此外,main()
中没有指针来保存int *record_array (int *size_ptr)
返回的地址,以在不再需要时在main()
和free
中使用。 print_array
仅打印数组,不返回任何内容(不应返回任何内容),因此应为void
类型,例如void print_array (int *array_ptr, int *size_ptr)
[访问时,(此处不涉及4个例外),数组将转换为指向第一个元素C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3)的指针。当您要传递数组时,只需传递该数组作为参数,它就会自动转换为指针。
也note,整个代码中没有数组。声明一个指针,然后分配一个内存块来保存您的整数值,然后将该块的起始地址分配给指针。 (例如,指针将分配的块的起始地址作为其值,它“指向”该内存块)
对于初学者,在main()
中,您需要一个指针来保存record_array
返回的地址,例如
int size = 0;
int *array = NULL; /* you need a pointer to hold the address of your array */
在record_array
中(以及每个分配),您必须检查malloc()
的返回值以验证它是成功还是失败,例如
int *record_array (int *size_ptr)
{
int *array_ptr = malloc (*size_ptr * sizeof *array_ptr);
if (!array_ptr) { /* validate EVERY allocation */
perror ("malloc-array_ptr");
return NULL;
}
...
(note:使用取消引用的指针设置分配的type-size。使用取消引用的指针-您永远不会弄错。在C语言中,不需要强制返回malloc
的返回值,这是不必要的。请参阅:Do I cast the result of malloc?)
使用输入,您必须验证每个输入,例如在record_array()
中将是:
for (int index = 0; index < *size_ptr; index++)
{
printf ("Enter element at index %d: ", index);
if (scanf ("%d", &array_ptr[index]) != 1) {
fputs ("error: invalid integer input.\n", stderr);
return NULL;
}
}
扩展验证范围,每次您在代码中执行可能会失败的操作(例如占用用户输入或分配内存)时,都必须先验证返回值,然后再在代码中使用结果。上面,如果您只执行scanf ("%d", &array_ptr[index])
,只需滑动并轻击'r'
而不是'5'
就会被忽略,但会导致代码中的结果无效(如果Undefined Behavior出现在第一个字符上)
为了防止使用无效数据,请检查返回值使用的功能。使用scanf
,它返回成功转换的次数;如果在第一次转换之前发生故障,则返回EOF
。因此,在使用scanf
进行输入时,您始终要检查返回值是否与您在format-string中指定的转换次数匹配。使用"%d"
时–将转换为int
。因此,要验证输入,请使用:
if (scanf ("%d", &array_ptr[index]) != 1) {
fputs ("error: invalid integer input.\n", stderr);
return NULL;
}
((仅说明从scanf()
返回的不是1
–处理错误-在这种情况下将返回失败(或NULL
))
最后在main()
中,您将在使用record_array
中分配的块之前验证NULL
的返回值不是print_array()
,>
] >>if ((array = record_array (&size))) { /* validate record_array succeeds */ print_array (array, &size); /* print array */ free (array); /* free array */ }
(比较项是
if ((array = record_array (&size)) != NULL) {...
的简写。只要您[验证返回
array = record_array (&size);
,就可以单独进行赋值,例如if (array != NULL) {...
然后是:)
。进行这些更正(并在提示中提供空格以分隔提示和输入):
#include <stdio.h> #include <stdlib.h> int *record_array (int *size_ptr); void print_array (int *array_ptr, int *size_ptr); int *record_array (int *size_ptr) { int *array_ptr = malloc (*size_ptr * sizeof *array_ptr); if (!array_ptr) { /* validate EVERY allocation */ perror ("malloc-array_ptr"); return NULL; } for (int index = 0; index < *size_ptr; index++) { printf ("Enter element at index %d: ", index); if (scanf ("%d", &array_ptr[index]) != 1) { fputs ("error: invalid integer input.\n", stderr); return NULL; } } return array_ptr; } void print_array (int *array_ptr, int *size_ptr) { for (int index = 0; index < *size_ptr; index++) printf ("%d ",array_ptr[index]); putchar ('\n'); /* tidy up with newline */ } int main() { int size = 0; int *array = NULL; /* you need a pointer to hold the address of your array */ printf("How many elements do you want? "); if (scanf("%d", &size) != 1) { /* validate EVERY input */ fputs ("error: invalid integer input.\n", stderr); return 1; } if ((array = record_array (&size))) { /* validate record_array succeeds */ print_array (array, &size); /* print array */ free (array); /* free array */ } }
示例使用/输出
$ ./bin/readarrayfunc How many elements do you want? 5 Enter element at index 0: 1 Enter element at index 1: 2 Enter element at index 2: 3 Enter element at index 3: 4 Enter element at index 4: 5 1 2 3 4 5
也请注意声明,
'*'
与变量一起,而不是类型。为什么?可读性。看:int* a, b, c;
那当然没有声明
int
的3指针,它声明了int
的一个指针和两个整数:int *a, b, c;
说明清楚。
仔细检查,如果还有其他问题,请告诉我。