我正在编写一个动态生成数组的程序,就像一个清除锈迹的实验,仍然是学生并且还没有做过一段时间的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的专业人士! :)
答案 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语言没有提供一种机制来记住过去变量转换为的类型。它只知道当前正在执行的参考类型。