无法将整数数组作为参数传递给局部参数为字符指针的函数

问题描述

我有一个main函数,它声明一个整数数组。我想将此数组传递给参数类型为char *函数。我无法更改被调用函数的签名。

我的目标是将main的整数数组data1内容复制到disp的整数数组data2中,但是当我尝试以下代码时,我得到不正确的值。 data2 [0] = 10,data2 [1] = 0,data2 [2] = 0,data2 [3] = 0,data2 [4] = 20。

我如何纠正它来产生data2 [0] = 10,data2 [1] = 20,data2 [2] = 30,data2 [3] = 40,data2 [4] = 50?

注意data2data1的大小相同不是强制性的。大小可以相同或更大。我希望data2的前五个元素最终与data1的相应元素相同。

#include<stdio.h>

void disp(char *buffer)
{
    int itr,data2[5];
    for(itr=0;itr<5;itr++)
    {
        data2[itr]=(int*)buffer[itr];
        printf("data2[%d]= %d\n",itr,data2[itr]);
    }
}

int main(void)
{
    int data1[5]={10,20,30,40,50};
    disp((char*)data1);
    return 0;
}

解决方法

函数调用似乎不是问题。您可以像执行操作一样强制转换data1以键入char *,这也是匹配function参数类型所必需的。实际上,这是一种特殊情况,甚至允许通过结果char *访问指向的数据。

问题在于在disp()内部读出数据。这句话:

        data2[itr]=(int*)buffer[itr];

被破坏是因为索引运算符[]的优先级高于强制转换运算符。结果,您正在读取itr指向的数据的buffer th 字节,将其转换为类型int *,将结果隐式转换为{ {1}}(如果尚未警告编译器,则提高其警告级别),并将最终结果存储在int中。可能通过类型data2作为中间形式实际上是一个空操作。

您可以做的最简单的更改是插入括号以覆盖默认的运算符优先级:

int *

首先将 data2[itr] = ((int*)buffer)[itr]; 转换为buffer,然后访问其中的int * itr 它指向了,这就是您想要的。

但是,个人而言,如果我依赖于该参数实际上是一个int,但是无法正式更新参数类型(但是无论如何仍可以修改函数实现),那么我将创建一个正确类型的副本作为我做的第一件事:

int *

那我以后就可以做

void disp(char *buffer) {
    int *int_buffer = (int *) buffer;

并且通常从事业务几乎就像我能够正确设置参数类型一样。

或者,对于这种特殊用途,您可以选择简单地执行批量复制:

    // ...

        data2[itr] = int_buffer[itr];

    // ...

完成,除了打印结果。

,

例如在函数中使用此语句

data2[itr] = *(int*)( buffer + itr * sizeof( int  ) );

否则,由于buffer的类型为char *,因此,表达式buffer[itr]不会指向类型为int的正确对齐的对象。

或者如@n. 'pronouns' m在评论中指出,您可以使用此语句

data2[itr] = ((int*)buffer )[itr];

实际上是一样的。

那是您需要正确应用指针算法。

,

如您所知,您正在将int数组发送给函数,则可以安全地将其强制转换为int *

void disp(char *buffer)
{
    int *intBuffer = (int *) buffer;
    int itr,data2[5];

    for ( itr=0; itr < 5; itr++)
    {
        data2[itr] = intBuffer[itr];

        printf("data2[%d]= %d\n",itr,data2[itr]);
    }
}
,

在您的代码data1中,int[5]是五个int的数组。您可以将指针声明为int (*)[5]

请参见此代码,将您的disp()代码更改为

void _disp(char* buffer)
{
    int(*original)[5] = (int(*)[5])(buffer);
    int data2[50];

    for (int itr = 0; itr < 5; itr += 1)
    {
        data2[itr] = (*original)[itr];
        printf("data2[%d]= %d\n",data2[itr]);
    };
};

它显示

Using (*)[5]

data2[0]= 10
data2[1]= 20
data2[2]= 30
data2[3]= 40
data2[4]= 50

为此代码

#include <stdio.h>
void _disp(char*);

int main(void)
{
    int data1[5] = { 10,20,30,40,50 };
    printf("\nUsing (*)[5]\n\n");
    _disp((char*)data1);
    return 0;
}

void _disp(char* buffer)
{
    int(*original)[5] = (int(*)[5])(buffer);
    int data2[50];

    for (int itr = 0; itr < 5; itr += 1)
    {
        data2[itr] = (*original)[itr];
        printf("data2[%d]= %d\n",data2[itr]);
    };
};

[根据MSVC 19.27编译]

一种可以说更清洁,更灵活的方式

此代码也适用

void _disp2(char* buffer)
{
    int*    pInt = (int*)buffer;
    int     data2[50];

    for (int itr = 0; itr < 5; itr += 1)
    {
        data2[itr] = *(pInt + itr);
        printf("data2[%d]= %d\n",data2[itr]);
    };
};

在这里,我们只是将buffer强制转换为(int*)并使用算术来复制值,因为无论如何它在内存中都是一个接一个的。

,

简短回答。使用联合和指针,而不是强制类型转换。

const sendVerificationCode = (event: any) => {
    console.log('Component: sendVerificationCode working')

    // Event: Cancels Event (Stops HTML Default Form Submit)
    event.preventDefault();

    // Event: Prevents Event Bubbling To Parent Elements
    event.stopPropagation();

    setValidated(true);

    ...