在C程序中自动转换一个指向int的空指针有可能吗?
我当时正在编写一个动态生成数组的程序,这只是一个清除锈迹的实验,我还是一名学生,已经有一段时间没有编写C代码了:请参见下面代码中用工作注释标记的块 约束:只有一个空指针指向用户请求/生成的类型数组。数组可以是浮点、int、double和char 您不能在主例程中创建任何其他类型的指针 是否可以将空指针自强制转换为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
#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],无论您的具体情况如何。同意,我只是在练习生成可以返回指针的函数