当前位置: 首页 > 知识库问答 >
问题:

自铸造一个空指针指向int在C程序是可能的吗?

孙渝
2023-03-14

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

约束:你只有一个空指针指向用户请求/生成的类型数组(数组可以是浮点数,int,双,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!:)

共有3个答案

谷梁宁
2023-03-14

您的节目中的演员阵容不正确。malloc()返回需要转换为int*的void*指针,如下所示。

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这是一个空*,导致int*类型被删除。c语言没有提供一种机制来记住变量过去被转换成什么类型。它只知道当前正在执行的引用类型。

沙富
2023-03-14

是,可以键入空指针

而你正忙着分配

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

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

太叔高义
2023-03-14

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

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

 类似资料:
  • 我一直在看米切尔、奥尔德姆和塞缪尔的高级Linux编程。我在pthread的章节中看到了一些让我困惑的关于空指针和铸造的内容。 将参数传递给pthread_create(),它们不会将指针强制转换为空指针,即使这是函数所期望的。 这里,which_prime类型为int。 但是使用pthread_join从线程返回一个值,它们会将变量强制转换为void指针。 这里,prime也是int类型。 为什

  • 在下面给出的代码中,我声明了一个指向int的指针,我们都知道memcpy返回一个指向目标字符串的空指针,所以如果ptr是指向int的指针,那么为什么printf(“%s”,ptr);是完全有效的,ptr毕竟不是指向char的指针。

  • 我正在学习如何在C中使用并写了以下示例: 问:是否保证在所有情况下指向一个结构的指针都是指向它的第一个元素的完全相同的指针? 在这种特殊的情况下,它能像我预期的那样工作,但我不确定它是否能得到保证。编译器可以在开始时插入一些填充吗? 我唯一能找到的关于结构类型布局的是N1570的类型: 结构类型描述了一组按顺序分配的非空成员对象(在某些情况下,还包括一个不完整的数组),每个对象都有一个可选的指定名

  • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p

  • 本文向大家介绍什么是指向指针的指针? 相关面试题,主要包含被问及什么是指向指针的指针? 时的应答技巧和注意事项,需要的朋友参考一下 指针指向的变量是一个指针,即具体内容为一个指针的值,是一个地址. 此时指针指向的变量长度也是4位.

  • C++ 类 & 对象 一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符 ->,就像访问指向结构的指针一样。与所有的指针一样,您必须在使用指针之前,对指针进行初始化。 下面的实例有助于更好地理解指向类的指针的概念: #include <iostream> using namespace std; class Box { public: