繁体   English   中英

在函数中更改指针地址

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM