【问题标题】:how to scan items in to an array of void*?如何将项目扫描到 void* 数组中?
【发布时间】:2013-06-01 18:26:08
【问题描述】:

我有 2 个这样声明的指针:

void *arr1,*arr2;

我将为这两个指针动态分配内存,然后扫描它们的一些输入。 例如,对于第一个我这样做:

scanf("%c",&typ);
scanf("%d",&len1);

用户输入输入的类型,以及他希望“数组”的大小。 我的问题是如何使用 scanf 函数将项目扫描到这些数组中。 我试过这个:

/*scan 1st array items*/
if(typ == 'i')
{
    arr1 = (int*)malloc(len1 * sizeof(int));
    for(i=0 ; i < len1 ; i++)
        scanf("%d",arr1[i]);
}
if(typ == 'f')
{
    arr1 = (float*)malloc(len1 * sizeof(float));
    for(i=0 ; i < len1 ; i++)
        scanf("%f",arr1[i]);
}
if(typ == 'c')
{
    arr1 = (char*)malloc(len1 * sizeof(char));
    for(i=0 ; i < len1 ; i++)
        scanf("%c",arr1[i]);
}
/*end scanning 1st array*/

但我得到了这些错误:

我做错了什么? 谢谢

【问题讨论】:

  • 请发布文字,而不是文字图片...
  • 您的 scanf("..", arr1[i]) 爆炸了,因为您无法索引到 void 的“数组”。想想arr1[i] 相当于arr1 + i * sizeof(void)。但是sizeof(void) 到底是什么?这种说法没有任何意义。
  • @djf 你是对的。对于第一个 if 条件,scanf("%d",arr1+i*sizeof(int)); 怎么样?为什么它不起作用?
  • You can't do pointer arithmetic on a void pointer。您必须将整个内容转换为 (int*),然后对其进行索引,最后将指针传递给 scanf。像 &(((int*)arr1)[i])... 之类的东西……但那太混乱了——即使谈论它我也觉得很脏阻止

标签: c pointers scanf void


【解决方案1】:

如果你想做我认为你想做的事,你最好先定义一个联合,然后用它来定义变量的使用。

#include <stdio.h>
#include <stdlib.h>

typedef union s
{
    int d;
    char c;
    float f;
}multi;

int main()
{
    multi *p;
    int len;
    char type;
    int loop;
    printf("Enter the type::\t");
    scanf("%c",&type);
    printf("Enter the length::\t");
    scanf("%d",&len);
    if(type == 'i')
    {
        p = malloc (sizeof(multi) * len);
        for(loop=0;loop<len;loop++)
        {
            scanf("%d",&p[loop].d);
        }
        printf("Values::\n");
        for(loop=0;loop<len;loop++)
        {
            printf("%d\n",p[loop].d);
        }
    }
    else if (type == 'f')
    {

        p = malloc (sizeof(multi) * len);
        for(loop=0;loop<len;loop++)
        {
            scanf("%f",&p[loop].f);
        }
        printf("Values::\n");
        for(loop=0;loop<len;loop++)
        {
            printf("%f\n",p[loop].f);
        }
    }
    else if (type == 'c')
    {

        p = malloc (sizeof(multi) * len);
        for(loop=0;loop<len;loop++)
        {
            scanf("%c",&p[loop].c);
        }
        printf("Values::\n");
        for(loop=0;loop<len;loop++)
        {
            printf("%c\n",p[loop].c);
        }
    }
    else
    {
        printf("\nNot a valid type!\n");
    }
    free(p);
    return 0;
}

原因是使用联合不会浪费额外的空间,同时您可以获得灵活性 使用指针访问变量。不建议投malloc()类型

【讨论】:

    【解决方案2】:

    改成

    if(typ == 'i')
    {
        arr1 = malloc(len1 * sizeof(int));
        for(i=0 ; i < len1 ; i++)
            scanf(" %d", (int*)arr1 + i);
    }
    if(typ == 'f')
    {
        arr1 = malloc(len1 * sizeof(float));
        for(i=0 ; i < len1 ; i++)
            scanf(" %f", (float*)arr1 +i);
    }
    if(typ == 'c')
    {
        arr1 = malloc(len1 * sizeof(char));
        for(i=0 ; i < len1 ; i++)
            scanf(" %c", (char*)arr1 +i);
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2013-11-05
      • 2013-08-27
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多