[英]Changing pointer address in function
我需要在这里更改以便动物包含{3,4}?
void funct(unsigned char *elf)
{
unsigned char fish[2]={3,4};
elf=fish;
}
int main()
{
unsigned char animal[2]={1,2};
funct(animal);
return 0;
}
编辑:我看到memcpy是一个选项。 有另一种方法只是操纵指针?
有另一种方法只是操纵指针?
不,因为animal
不是指针。 animal
是一个阵列。 当你将它作为参数传递给函数时,它会衰减到指向其第一个元素的指针,就像你说过&animal[0]
。
即使您使用指针并在funct
获取指针,它仍然无法工作:
void funct(unsigned char** elf)
{
unsigned char fish[2] = { 3, 4 };
*elf = fish; // oh no!
}
int main()
{
unsigned char animal[2] = { 1, 2 };
unsigned char* animal_ptr = animal;
funct(&animal_ptr);
}
行后标有“哦不!” fish
阵不再存在; 当funct
返回时它会消失,因为它是一个局部变量。 您必须使其静态或动态分配,以便在函数返回后仍然存在。
即便如此,它仍然与你想要的不一样,因为它永远不会改变animal
; 它只会修改animal_ptr
指向的位置。
如果你有两个数组并且想要将一个数组的内容复制到另一个数组中,则需要使用memcpy
(或者滚动你自己的类似memcpy
的函数,它可以循环或按顺序复制数组元素)。
由于animal
在传递给函数时会衰减为指针,因此您可以替换:
elf=fish;
有:
elf[0] = fish[0]; // or: *elf++ = fish[0]
elf[1] = fish[1]; // *elf = fish[1]
或者,假设它们的大小相同:
memcpy (elf, fish, sizeof (fish));
发布问题编辑:
编辑:我看到memcpy是一个选项。 有另一种方法只是操纵指针?
如果你的意思是改变指针本身的值,那么通过操作指针就没有安全的方法。 如果你传入一个指向指针的指针 ,你可以改变它指向其他位置但是,如果你指向fish
阵列,你会遇到麻烦,因为当你退出funct()
时它超出了范围funct()
。
您可以使用指针根据我上面的第一个解决方案传输字符( elf[n]
数组访问相当于*(elf+n)
指针访问)。
一种选择是单独分配元素:
void funct(unsigned char *elf){
elf[0] = 3;
elf[1] = 4;
}
另一种选择是使用memcpy
(需要包含string.h
):
void funct(unsigned char *elf){
unsigned char fish[2]={3,4};
memcpy(elf, fish, 2);
}
memcpy
将目标,源,然后要复制的字节数作为参数,在本例中为2。
void funct(unsigned char *elf) {
unsigned char fish[2]={3,4}; // stack variable, will dissapear after the function is exited
// elf=fish; this one assigns to the local copy of elf, that will also dissapear when we return
memcpy(elf, fish, sizeof(fish)); // so we have to copy values
// careful though, because sizeof(fish) can be bigger than sizeof(elf)
}
为了帮助解决维护问题,最好还是制作一个返回所需指针的函数,然后确保首先从原始数组中释放出任何内存。
unsigned char * func()
{
unsigned char * fish = malloc( sizeof(unsigned char) * 2 );
fish[0] = 3;
fish[1] = 4;
return fish;
}
int main ( void ) { unsigned char * animal = malloc( sizeof(unsigned char) * 2 ); animal[0] = 1; animal[1] = 2; free( animal ); animal = func(); }
尝试重新分配使用'unsigned char animal [2]'语法声明的数组是一个问题,因为它将整个原始数组放在堆栈上,即使编译器允许你这样做,你最终会得到一个堆栈上无法使用的内存块。 我不设计编程语言,但感觉非常错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.