Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C程序中自动转换一个指向int的空指针有可能吗?_C_Pointers_Int_Void - Fatal编程技术网

在C程序中自动转换一个指向int的空指针有可能吗?

在C程序中自动转换一个指向int的空指针有可能吗?,c,pointers,int,void,C,Pointers,Int,Void,我当时正在编写一个动态生成数组的程序,这只是一个清除锈迹的实验,我还是一名学生,已经有一段时间没有编写C代码了:请参见下面代码中用工作注释标记的块 约束:只有一个空指针指向用户请求/生成的类型数组。数组可以是浮点、int、double和char 您不能在主例程中创建任何其他类型的指针 是否可以将空指针自强制转换为int* 下面是一些奇怪的代码: #include <stdio.h> #include <stdlib.h> //prototypes int* create

我当时正在编写一个动态生成数组的程序,这只是一个清除锈迹的实验,我还是一名学生,已经有一段时间没有编写C代码了:请参见下面代码中用工作注释标记的块

约束:只有一个空指针指向用户请求/生成的类型数组。数组可以是浮点、int、double和char 您不能在主例程中创建任何其他类型的指针

是否可以将空指针自强制转换为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的专业ppl!:

是,可以键入空指针

在分配和打印值时,基址不会递增。在这里找到更正

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

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

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


然后,正如mahendiran所说,for循环可能不是您想要它做的。只需使用arr_ptr[i]=i;在数组的第i个位置写入i。

程序中的强制转换不正确。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_数组的返回值应保存在int*ptr中。在本例中,它保存在arr_ptr中,这是一个空*导致int*类型被删除。c语言没有提供一种机制来记忆变量在过去被转换为什么类型。它只知道当前正在执行的引用类型。

当然,arr\u ptr=int*arr\u ptr不会做任何事情,就像做一些变量=一些变量,并期望实际发生的事情一样。arr_ptr变量的类型为void*,任何强制转换都不会改变它,这就是为什么在访问元素之前需要强制转换指针的原因。如果您不想在每次需要将其用作整数数组时强制转换,请添加一个新变量:int*int\u arr\u ptr=arr\u ptr;你的标题是误导性的,你正在将一个空指针转换为指向int的指针,而不是指向int的指针。因此,基本上你是说自转换不会改变指针@JoachimPileborg的类型声明,有没有什么神奇的方法可以做到这一点,这就是我要问的。不,没有这样的方法,C有静态类型。也许你可以告诉我们你想用这些东西做什么。这与程序动态生成任何类型的数组不太像,它的约束条件是在主例程中只使用一个空指针,或者只使用一个指针,来指向根据用户输入生成的任何数组。试着运行代码,自己看看吧!它仍然给了我正确的序列0123456789@Dexobox是的,因为您正在设置1。元素,并在同一个循环中打印出来,您不是在数组上迭代。@否并不真正关心在数组中存储元素,主要问题是我希望能够更改指针的类型以永久指向int数据,或者基本上将其更改为int类型pointer@Dexobox你不能那样做,C是静态类型的。您可以设置另一个变量,这意味着请将arr_ptr视为int*,然后让所有想要使用arr_ptr的人在访问它时都包含将arr_ptr转换为int*的逻辑。好吧,这有点道理,我的目标是使用一个空指针,并询问是否可以将其类型更改为int指针,基于程序的用户输入/流的双指针或字符指针,我猜不是!谢谢!因此,我为我想要动态生成的每种类型的数组创建空指针。是的,这是一个选项,如果它不是一个选项,那么假设您有一个指针指向程序用户请求创建的任何类型的数组。忘记打印数组吧,这是一个没有问题的调试代码,可以检查它们是否工作;给出../array.c:46:3:错误:无效表达式arr_ptr[i]=i的使用@延斯Gustedt@Dexobox,是的,当然,正如我所说的,只有在为指针选择了正确类型的情况下,这才有效。对于您的通用性,您的create_int_数组函数完全没有用处。只需使用mallocsizeoffint[size],mallocsizeofloat[size],无论您的具体情况如何。同意,我只是在练习生成可以返回指针的函数