首页 文章

自编一个void指针指向C程序中的int是否可能?

提问于
浏览
0

我正在编写一个程序来动态生成数组,就像一个清除生锈的实验,仍然是学生并且还没有做过一段时间的C代码:请参阅下面代码中标有“WORKING”注释的块 .

Constraint : you have only one void pointer to point to user requested/generated type array(the array can be a float, int, double, char)
你不能在主例程中创建任何其他类型的指针 .

是否可以将void指针自行转换为(int *)

这是一些奇怪的代码:

#include <stdio.h>
#include <stdlib.h>

//prototypes
int* create_int_arr(int);

int main()
{
    int choice, arr_size;
    void* arr_ptr;
    printf("Please enter what kind of array you want?");
    printf("\nOptions are :");
    printf("\n1: int 2:float 3:char 4:double");
    scanf("%d",&choice );
    printf("\nHow many elements in the array do you want?");
    scanf("%d",&arr_size);
    switch(choice){
        case 1: printf("\nYou have chosen Integer array");
            arr_ptr =(int *) create_int_arr(arr_size);
            printf("\nThe array starts at %p",arr_ptr);
            break;
        case 2: printf("\nYou have chosen Float array");
            //create_float_arr();
            break;
        case 3: printf("\nYou have chosen a char array");
            //create_char_arr();
            break;
        case 4: printf("\nYou have chosen a double array");
            //create_double_arr();
            break;
        default:printf("\nYou have not chosen properly! Exiting!");
            return 0;
            break;
    }
    //arr_ptr = (int *)arr_ptr    <= does nothing FAIL! self cast
    int i;
    for(i=0;i<arr_size;i++)
    {
        //==========WORKING =============
        *(int*)arr_ptr = i;           //casting the void pointer to int to store values every time, would like to self cast the void pointer to int* permanently any way to do this?
                  //i know i can declare a new int pointer and cast the void* into int* but lets just say that was not an option for arguments sake

        printf("\n%d", *(int *)arr_ptr);
        //=================================
    }

    return 0;
}

int* create_int_arr(int size){
    int * ptr = malloc(sizeof(int)*size);
    printf("\nThe array starts at %p",ptr);
    return ptr;
}

帮我在C的专业人士! :)

3 回答

  • 0

    程序中的转换不正确 . malloc()返回一个void *指针,需要将其强制转换为int *,如下所示 .

    int* create_int_arr(int size){
                int * ptr = (int *)malloc(sizeof(int)*size);
                printf("\nThe array starts at %p",ptr);
                return ptr;
    }
    

    create_int_array的返回值应保存在int * ptr中 . 在示例中,它保存在arr_ptr中,这是一个void *导致删除int *类型 . c语言没有提供一种机制来记住过去变量转换为的类型 . 它只知道当前正在执行的参考类型 .

  • 0

    您的函数已经返回 int* ,因此只需将指针类型更改为 int* 并删除所有强制转换 . 一个好的C程序不应该包含强制转换,但从一开始就为所有变量选择了正确的类型 .

    然后,就像mahendiran所说的那样, for -loop可能不是你想要它做的 . 只需使用 arr_ptr[i] = i; 在数组的 i 位置写入 i .

  • 0

    是的void指针可以被类型化 .

    当你想要分配和打印值时,基地址不会增加 . 在这里找到更正

    *(int*)(arr_ptr+i) = i; 
    printf("\n%d", *(int *)(arr_ptr+i));
    

    arr_ptr是一个指针,它只保存基址 . 在您的情况下,遍历基址并分配值 .

相关问题