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

时间:2014-10-21 07:32:09

标签: c pointers int void

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

约束:你只有一个指向用户请求/生成类型数组的void指针(数组可以是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 :(得分:0)

是无效指针可以被类型化。

当你想要分配&amp;打印该值,基地址不递增。在这里找到更正

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

arr_ptr是一个指针,只保存基址。在您的情况下,遍历基址并赋值。

答案 1 :(得分:0)

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

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

答案 2 :(得分: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语言没有提供一种机制来记住过去变量转换为的类型。它只知道当前正在执行的参考类型。