在函数中更改指针地址

时间:2010-10-26 03:23:01

标签: c pointers

我需要在此处更改以便动物包含{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是一个选项。还有其他方法只是操纵指针吗?

5 个答案:

答案 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]'语法声明的数组是一个问题,因为它将整个原始数组放在堆栈上,即使编译器允许你这样做,你也会结束堆栈上有大量无法使用的内存。我不设计编程语言,但感觉非常错误。