首页 > 解决方案 > 在 C 中添加 2 个 void 指针数组

问题描述

有以下挑战:用C 语言编写多态函数: void *add(void *arr1, void *arr2);

该函数采用 2 个任意类型的数组并将它们的内容添加到第三个数组 arr3 中:

arr3[0]=arr1[0]+arr2[0];
arr3[1]=arr3[1]+arr2[1];
.....
arr3[n]=arr1[n]+arr2[n];

该函数必须返回 arr3 作为结果。

不允许取消引用 void 指针,我认为将 2 个数组(arr1 和 arr2)转换为 char* 不是一个好习惯,因为内容可能是 int、float、double 等。怎么可能实现这样的功能?

标签: cfunctionpolymorphismaddvoid-pointers

解决方案


这个函数声明

void *add(void *arr1, void *arr2);

不提供有关例如数组元素的实际类型和数组包含的元素数量的必需信息。

您还需要在某个地方提供一个代码,该代码将执行添加数组的两个元素的操作。

您应该更改函数声明,指定类似于标准 C 函数的参数的附加参数,qsort或者将所需信息存储在函数可以访问的全局变量中的某个位置,

这是一个演示程序。.

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

size_t nmemb;
size_t size;

void ( *operation )( void *, const void *, const void * );

void * add( const void *arr1, const void *arr2 )
{
    void *result = malloc( nmemb * size );
    
    if ( result )
    {
        for ( size_t i = 0; i < nmemb; i++ )
        {
            operation( ( char * )result + i * size, 
                       ( const char * )arr1 + i * size,
                       ( const char * )arr2 + i * size );
        }
    }
    
    return result;
}

void add_int( void * result, const void *operand1, const void *operand2 )
{
    *( int * )result = *( const int * )operand1 + *( const int * )operand2;
}

void add_double( void * result, const void *operand1, const void *operand2 )
{
    *( double * )result = *( const double * )operand1 + *( const double * )operand2;
}

int main(void) 
{
    int arr1[] = { 0, 1, 2, 3, 4 };
    int arr2[] = { 5, 6, 7, 8, 9 };
    
    nmemb = sizeof( arr1 ) / sizeof( *arr1 );
    size = sizeof( int );
    operation = add_int;
    
    int *result1 = add( arr1, arr2 );
    
    if ( result1 )
    {
        for ( size_t i = 0; i < nmemb; i++ )
        {
            printf( "%d ", result1[i] );
        }
        
        putchar( '\n' );
    }
    
    free( result1 );
    
    double arr3[] = { 0.0, 1.1, 2.2, 3.3, 4.4 };
    double arr4[] = { 5.5, 6.6, 7.7, 8.8, 9.9 };
    
    nmemb = sizeof( arr3 ) / sizeof( *arr3 );
    size = sizeof( double );
    operation = add_double;
    
    double *result2 = add( arr3, arr4 );
    
    if ( result2 )
    {
        for ( size_t i = 0; i < nmemb; i++ )
        {
            printf( "%.1f ", result2[i] );
        }
        
        putchar( '\n' );
    }
    
    free( result2 );
    
    return 0;
}

程序输出为

5 7 9 11 13 
5.5 7.7 9.9 12.1 14.3 

推荐阅读