我需要在此处更改以便动物包含{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是一个选项。还有其他方法只是操纵指针吗?
答案 0 :(得分:5)
还有另一种方法只是操纵指针吗?
不,因为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
- 类似于复制数组元素的函数循环或顺序或())。
答案 1 :(得分:4)
由于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()
时超出范围。
您可以使用指针根据上面的第一个解决方案传输字符(elf[n]
数组访问等同于*(elf+n)
指针访问。)
答案 2 :(得分:1)
一种选择是单独分配元素:
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。
答案 3 :(得分:1)
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)
}
答案 4 :(得分:0)
为了帮助解决维护问题,你可能最好做一个返回你想要的指针的函数,然后确保你真的从原始数组中释放了所有内存。
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]'语法声明的数组是一个问题,因为它将整个原始数组放在堆栈上,即使编译器允许你这样做,你也会结束堆栈上有大量无法使用的内存。我不设计编程语言,但感觉非常错误。