c指针和数组,将内容复制到另一个数组中

时间:2014-04-10 00:14:31

标签: c arrays pointers

我知道这可能是一个基本问题,但我从来没有完全掌握C中的整个指针概念。

我的问题是,假设我有一个int数组,我把它传递给像这样的函数 `

int main(){
    int *a = malloc(sizeof(int*)*4);

    // add values to a
    p(a);
}

void p(int *a){
   int *b = malloc(sizeof(int*)*4)
   b = a;
   // change values in b

   //print a b
}`

这样做的正确方法是什么,这样我对b做的任何改变都不会影响?中的值?

5 个答案:

答案 0 :(得分:4)

在你的'p'方法中,你将指针b指定为指针a,或者换句话说,你指的是b指向指向的指针。对b的任何更改都会导致对a的更改,因为它们都会指向同一块内存。

使用memcpy复制内存块。它看起来像这样:

#include <string.h>
#include <stdlib.h>
void p(int *a){
   int *b = (int*)malloc(sizeof(int)*4);
   memcpy(b, a, sizeof(int)*4);

    //make changes to b.
   b[0] = 6;
   b[1] = 7;
   b[2] = 8;
   b[3] = 9;
}

int main(int argc, char **argv)
{
    int *a = (int*)malloc(sizeof(int)*4);

    // add values to a
    a[0] = 1;
    a[1] = 2;
    a[2] = 3;
    a[3] = 4;

    p(a);

return 0;
}

答案 1 :(得分:1)

仅指定指针意味着b指向与a相同的内存块和您刚刚分配的内存&#34;对于b&#34;泄露了。它已经分配但你不能再免费了。

要复制你需要的数组,请复制它。

简单的方法是查找各种memcpy方法,或者只是更长的方式

for (int i = 0; i < 4; i++) {
    b[i] = a[i];
}

你需要知道&#34;浅拷贝&#34;和#34;深拷贝&#34; - 因为你有一个int*的数组,我上面提到的是浅拷贝。如果您需要复制每个int*指向的内容,您将需要更复杂的内容。

答案 2 :(得分:0)

您将ab指向两个不同的内存块,然后将b分配给a指向的块,从而导致内存泄漏。

由于你没有从函数p()返回任何内容,你可以在堆栈上分配b(我不知道你在做什么)。

如果您打算复制这些指针所指向的数据,您可以使用memcpy或按其他人的建议逐个元素复制。

答案 3 :(得分:0)

C不支持数组赋值!您必须手动复制数据。

  • 使用memcpy
  • 如果a和b(可能)重叠,请使用memmove
  • 使用forwhile循环

答案 4 :(得分:0)

void p(int *a){
   int *b = malloc(sizeof(int*)*4)
   int size=4;
   while(size>=0){
     b[size--]=a[size--];
   }
   // change values in b

   //print a b
}

这应该有效!