簡體   English   中英

c指針和數組,將內容復制到另一個數組中

[英]c pointers and arrays, copying contents into another array

我知道這可能是一個基本問題,但我從來沒有完全掌握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做的任何改變都不會影響a中的值?

在你的'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;
}

剛分配的指針指b指向相同的內存塊作為a和你只是分配“的內存b ”已泄漏。 它被分配但你不能再釋放它了。

要復制您需要的數組,請復制它。

簡單的方法是查找各種memcpy方法,或者只是更長的方式

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

你需要知道“淺拷貝”和“深拷貝” - 因為你有一個int*數組,我上面提到的是淺拷貝。 如果你需要復制每個int*指向的內容,你將需要一些更復雜的東西。

您指向ab兩個存儲器的不同塊,然后分配b到塊指向a ,引起了內存泄漏。

既然你沒有從函數p()返回任何東西,你可以在堆棧上分配b (我不知道你在做什么)。

如果您打算復制這些指針指向的數據,您可以像其他人建議的那樣使用memcpy或逐個元素復制。

C不支持數組賦值! 您必須手動復制數據。

  • 使用memcpy
  • 如果a和b(可能)重疊,請使用memmove
  • 使用forwhile循環
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
}

這應該工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM