使用指针记录和打印数组

问题描述 投票:0回答:1

我是编码的新手,开始学习指针,我陷入了一个问题。问题是将数组输入作为指针并使用指针打印相同的数组。如果您能指导我如何将变量从函数传递到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;
}
c pointers
1个回答
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;

说明清楚。

仔细检查,如果还有其他问题,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.