问题描述
我有一个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?
注意:data2
与data1
的大小相同不是强制性的。大小可以相同或更大。我希望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);
...